XmlSerializer,"指定"后缀和IReflect

Luc*_*uca 7 c# reflection xml-serialization

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

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

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

这会有用吗?

小智 6

我将扩展马丁·佩克的回答。您可以避免使用“指定”后缀对字段/属性进行序列化。您应该在类中定义“*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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*eck 2

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

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

另一种方法是在类上实现 IXmlSerialized 接口并实现 ReadXml 和 WriteXml 方法。这使您可以准确控制 xml 的外观。请参阅此问题以获取更多信息:

自定义 xml 序列化

然而,正如这里提到的,混合自定义序列化和基本序列化?一旦实现 IXmlSerialized,您就需要负责您的类型的所有序列化逻辑。