【发布时间】: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)属性,在我的情况下这是一个第三方类,我不能更改该代码。
我运气不好?
【问题讨论】:
标签: c# wcf serialization datacontractserializer