.NET 默认忽略 XmlIgnore?
.NET XmlIgnore By Default? 这个问题的出现的原因是在序列化对象时,默认情况下会忽略没有被标记为XmlIgnore的成员。解决方法是实现IXmlSerializable接口,并通过WriteXml和ReadXml方法来确定需要被序列化的内容。
下面是一个使用IXmlSerializable接口的示例:
using System; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; 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(XmlWriter writer) { writer.WriteElementString("Val", ValueToSerialize); } public void ReadXml(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"; XmlSerializer x = new XmlSerializer(typeof(ObjectToSerialize)); x.Serialize(Console.Out, t); return; } }
在上述代码中,ObjectToSerialize类实现了IXmlSerializable接口,并重写了WriteXml和ReadXml方法来指定需要被序列化的内容。在Main方法中,我们创建了一个ObjectToSerialize对象,并通过XmlSerializer将其序列化为XML并输出到控制台。
需要注意的是,如果想要序列化类的成员变量,需要将其改为属性。在示例代码中,我们假设Value1到Value5都是属性。
希望对你有所帮助。
在.NET中,XmlSerializer使用的是"opt-out"的过程——它会序列化所有的公共属性,除非你使用[XmlIgnore]
属性显式地选择忽略。没有办法改变这种行为。
另一方面,.NET 3.5的DataContractSerializer采取的是"opt-in"的方法。它不会序列化任何东西,除非你使用[DataMember]
来明确告诉它。所以也许DataContractSerializer适合你的需求?它有一些优点(不需要无参数构造函数,可以序列化内部和私有属性,还可以按需序列化字段),并且它还经过了速度优化。当然,也有一些缺点——它不支持XML节点中的属性,所以你需要根据自己的需求来选择。
Dan Rigsby在他的博客中对这两种序列化方式进行了很好的比较。可以去看一下!
可能一个关键因素是DataContractSerializer不支持XmlAttributeAttribute。