【问题标题】:Ignore base class members when serializing序列化时忽略基类成员
【发布时间】:2020-01-31 21:09:06
【问题描述】:

在序列化派生类的对象时如何忽略特定的基类成员?

背景

在我的例子中,基类是UndirectedGraph(来自 QuickGraph 库)。除其他事项外,该类中有两个成员我不想序列化:

public class UndirectedGraph<TVertex, TEdge>
{
  public IEnumerable<TEdge> Edges { get; }
  public IEnumerable<TVertex> Vertices { get; }
}

所以我从这个类派生并制作了我自己的类。然后我用new 重新定义了这两个成员,并在它们上应用了IgnoreDataMember。像这样:

public class OurGraph : UndirectedGraph
{
  [IgnoreDataMember]
  public new IEnumerable<XMLDoc> Vertices => base.Vertices;

  [IgnoreDataMember]
  public new IEnumerable<OurEdge> Edges => base.Edges;
}

现在我使用DataContractSerializerOurGraph 的对象写入文件:

public static string SerializeDC(this object obj)
{
  XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces();
  Namespaces.Add(string.Empty, string.Empty);

  System.Text.StringBuilder sb = new System.Text.StringBuilder();

  using (StringWriter writer = new StringWriter(sb))
  {
    using (XmlWriter xmlWriter = XmlWriter.Create(writer, myXmlWriterSettings))
    {
      DSSerializer.WriteObject(xmlWriter, obj);
      xmlWriter.Close();
    }

    writer.Close();
  }

  return sb.ToString();
}

不幸的是,这两个成员仍然可以进入输出。我做错了什么?

编辑

在进行进一步实验时,除非您在包含类上应用 DataContract 属性,否则 IgnoreDataMember 似乎将不起作用。现在在一个类上应用DataContract 属性需要它的基类也应用DataContract(或Serializable)属性,在我的情况下这是一个第三方类,我不能更改该代码。

我运气不好?

【问题讨论】:

    标签: c# wcf serialization datacontractserializer


    【解决方案1】:
    1. 在类上使用 Serializable 属性。
    2. 对您不想序列化的类属性使用 NonSerialized 属性。

    希望这能解决您的问题。

    【讨论】:

    • 听说NonSerialized属性对DataContractSerializer没有影响。
    • Plus NonSerialized 只能应用于字段,不能应用于属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多