序列化时忽略基类成员
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;
现在我使用DataContractSerializer
将OurGraph
的对象写入文件:
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
只能应用于字段,不能应用于属性。以上是关于序列化时忽略基类成员的主要内容,如果未能解决你的问题,请参考以下文章
Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的