XmlSerializer,“指定”后缀和IReflect

我发现如果可序列化的Field / Property有一个Boolean类型的相应字段,其字段名称为“Specified”后缀,则XmlSerializer有条件地从序列化过程中排除该字段/属性 。 太好了!

所以,我想避免这些字段的定义,并在运行时动态添加它们……

阅读本文 ,我发现了一个有趣的界面IReflect ,我可以用它来“模拟”XmlSerializer实例用来排除某些字段的动态字段。

这会有用吗?

如果您想控制xml序列化,那么您有两个选择。 第一个(这可能不适合)它使用System.Xml.Serialization命名空间中的属性来排除属性。 如果您确实需要确定在运行时序列化的内容,这可能不是最佳操作方法。

请参阅控制XML序列化的属性

另一种方法是在类上实现IXmlSerializable接口并实现ReadXml和WriteXml方法。 这使您可以控制xml的外观。 有关其他信息,请参阅此问题:

自定义xml序列化

但是,如此处所述混合自定义和基本序列化? 一旦实现IXmlSerializable,您就负责所有类型的序列化逻辑。

我将扩展Martin Peck的答案。 您可以避免使用“Specified”后缀序列化字段/属性。 您应该在类中定义“* Specified”属性并将[XmlIgnoreAttribute()]应用于它们。

这是一个例子:

 [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://yournamespace.com")] public partial class YourObject { private long sessionTimeoutInSecondsField; private bool sessionTimeoutInSecondsFieldSpecified; public long sessionTimeoutInSeconds { get { return this.sessionTimeoutInSecondsField; } set { this.sessionTimeoutInSecondsField = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] public bool sessionTimeoutInSecondsSpecified { get { return this.sessionTimeoutInSecondsFieldSpecified; } set { this.sessionTimeoutInSecondsFieldSpecified = value; } } }