在序列化派生类的对象时,我们如何忽略特定的基类成员?
背景
在我的例子中,基类是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
(属性,在我的情况下是第三方类,我无法更改该代码。
我运气不好吗?
- 在类上使用可序列化属性。
- 对不想序列化的类属性使用非序列化属性。
希望这能解决您的问题。