除非我另有说法,否则有没有办法让XmlSerializer忽略所有成员?
我有一个基类和几个派生类,有很多成员,但大多数我不想被序列化。只有少数几个可以接受序列化。
答案 0 :(得分:4)
不,你不能这样做。
XmlSerializer正在使用“选择退出”流程 - 除非您使用[XmlIgnore]
属性明确选择退出,否则它将序列化所有内容(所有公共属性)。没有办法改变这种行为。
另一方面,.NET 3.5 DataContractSerializer采用了另一种方法 - 选择加入。除非您明确指出,否则不会通过[DataMember]
装饰您的成员来序列化任何内容。
那么DataContract序列化器可能适合您吗?它还有一些优点(不需要无参数构造函数,也可以序列化内部和私有属性,如果需要,它还可以序列化字段而不是属性),并且它可以调整速度。还有一些缺点 - 它不支持XML节点中的属性 - 因此您必须根据您的要求进行选择。
通过Dan Rigsby对两者进行了很好的比较 - 检查出来!
马克
答案 1 :(得分:1)
您可以实施IXMLSerializable并确定要序列化的内容。 Here是对象序列化的一个示例。查看this SO帖子,了解实现IXMLSerializable的正确方法。 Here是IXMLSerializable用于某些集合的示例。
它看起来像这样:
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace ConsoleApplicationCSharp
{
public class ObjectToSerialize : IXmlSerializable
{
public string Value1;
public string Value2;
public string Value3;
public string ValueToSerialize;
public string Value4;
public string Value5;
public ObjectToSerialize() { }
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteElementString("Val", ValueToSerialize);
}
public void ReadXml(System.Xml.XmlReader reader)
{
if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "Event")
{
ValueToSerialize = reader["Val"];
reader.Read();
}
}
public XmlSchema GetSchema() { return (null); }
public static void Main(string[] args)
{
ObjectToSerialize t = new ObjectToSerialize();
t. ValueToSerialize= "Hello";
System.Xml.Serialization.XmlSerializer x = new XmlSerializer(typeof(ObjectToSerialize));
x.Serialize(Console.Out, t);
return;
}
}
}