.NET 默认忽略 XmlIgnore?

9 浏览
0 Comments

.NET 默认忽略 XmlIgnore?

有没有一种方法让XmlSerializer默认忽略所有成员,除非我另外指定?

我有一个基类和几个派生类,它们有很多成员,但我不希望大多数成员被序列化。只有少数几个成员可以被接受并进行序列化。

0
0 Comments

.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都是属性。

希望对你有所帮助。

0
0 Comments

在.NET中,XmlSerializer使用的是"opt-out"的过程——它会序列化所有的公共属性,除非你使用[XmlIgnore]属性显式地选择忽略。没有办法改变这种行为。

另一方面,.NET 3.5的DataContractSerializer采取的是"opt-in"的方法。它不会序列化任何东西,除非你使用[DataMember]来明确告诉它。所以也许DataContractSerializer适合你的需求?它有一些优点(不需要无参数构造函数,可以序列化内部和私有属性,还可以按需序列化字段),并且它还经过了速度优化。当然,也有一些缺点——它不支持XML节点中的属性,所以你需要根据自己的需求来选择。

Dan Rigsby在他的博客中对这两种序列化方式进行了很好的比较。可以去看一下!

可能一个关键因素是DataContractSerializer不支持XmlAttributeAttribute。

0