有没有办法让XmlSerializer默认忽略所有成员,除非我另行说明?
我有一个基类和几个具有许多成员的派生类,但大多数我不希望被序列化。只有选定的几个是可接受的序列化。
发布于 2009-09-30 05:31:23
不,您不能这样做。
XmlSerializer使用“选择退出”过程-它将序列化所有内容(所有公共属性),除非您使用[XmlIgnore]属性显式选择退出。没有办法改变这种行为。
另一方面,.NET 3.5 DataContractSerializer则采取了另一种方法--选择加入。它不会序列化任何东西,除非你特别告诉它,通过用[DataMember]装饰你的成员。
因此,也许DataContract序列化程序可以为您工作?它有更多的优点(不需要无参数的构造函数,也可以序列化内部和私有属性,如果需要的话,它还可以序列化字段而不是属性),并且它的速度得到了调整。也有一些缺点-它不支持XML节点中的属性-因此您必须根据自己的需求进行选择。
Dan Rigsby对这两者进行了很好的比较--来看看吧!
Marc
发布于 2009-09-30 01:41:52
您可以实现IXMLSerializable并确定要序列化的内容。Here就是对象序列化的一个例子。请查看this,以便发布实现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;
}
}
}https://stackoverflow.com/questions/1495716
复制相似问题