【发布时间】:2011-01-19 11:33:11
【问题描述】:
我有一个大约有 20 名成员的班级。我需要在 XML 中序列化这个类的对象。但条件是我只需要 XML 中的一个成员。
我该怎么做。
编辑:但有时,我想对所有成员进行序列化。所以我不能使用 [XMLIgnore] 属性。
【问题讨论】:
标签: c# .net xml serialization
我有一个大约有 20 名成员的班级。我需要在 XML 中序列化这个类的对象。但条件是我只需要 XML 中的一个成员。
我该怎么做。
编辑:但有时,我想对所有成员进行序列化。所以我不能使用 [XMLIgnore] 属性。
【问题讨论】:
标签: c# .net xml serialization
为所有不想序列化的成员添加以下属性,
[XmlIgnore()]
public Type X
{
get;set;
}
【讨论】:
您可以显式实现IXmlSerializable 接口并根据一些外部参数自行控制字段的读取/写入,即
class CustomXml: IXmlSerializable
{
public System.Xml.Schema.XmlSchema GetSchema()
{
//
}
public void ReadXml(System.Xml.XmlReader reader)
{
if (SerializationParameter.FullSerialization)
//deserialize everything
else
//deserialize one field only
}
public void WriteXml(System.Xml.XmlWriter writer)
{
if (SerializationParameter.FullSerialization)
//serialize everything
else
//serialize one field only
}
}
SerializationParameter.FullSerialization 是一个示例,说明如何控制何时序列化的内容。
【讨论】:
您可以将 [XmlIgnore] 属性放在您不想被序列化的所有成员上。
【讨论】:
有两种方法可以使用属性在 .NET 中使属性不可序列化。
您可以设置属性[NonSerialized] 或[XmlIgnore]
如果你用二进制或 SOAP 序列化你应该使用[NonSerialized],如果你想只用 XML 序列化你应该使用[XmlIgnore]。
所以在你的情况下,答案是[XmlIgnore]
编辑: 无法动态地将属性应用于属性。 这里有一些关于这里的信息:Can attributes be added dynamically in C#? 和这里 Remove C# attribute of a property dynamically
此外,作为一项锻炼,您可能拥有具有不同属性的不同班级副本。
或
有一个你的类的副本将所有道具设置为可序列化但只填充你需要的属性,这样其他所有东西都将为空/空,并且在该类的序列化之后你应该得到你需要的 XML。
【讨论】:
标记其他属性
<NonSerializable()> _
Property someproperty
结束属性
【讨论】: