.NET XmlIgnore默认情况下?

时间:2009-09-30 01:25:24

标签: c# xml-serialization

除非我另有说法,否则有没有办法让XmlSerializer忽略所有成员?

我有一个基类和几个派生类,有很多成员,但大多数我不想被序列化。只有少数几个可以接受序列化。

2 个答案:

答案 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;
    }
  }
}