序列化时忽略基类成员

Posted

技术标签:

【中文标题】序列化时忽略基类成员【英文标题】: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)属性,在我的情况下这是一个第三方类,我不能更改该代码。

我运气不好?

【问题讨论】:

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

希望这能解决您的问题。

【讨论】:

听说NonSerialized属性对DataContractSerializer没有影响。 Plus NonSerialized 只能应用于字段,不能应用于属性。

以上是关于序列化时忽略基类成员的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net 包括不可序列化基类的特定成员

仅在 ProtoBuf-net 中序列化基类

c ++设计:从基类转换为派生类,没有额外的数据成员

C# 在忽略命名空间的同时反序列化 xml

Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的

为啥杰克逊还要序列化瞬态成员?