C# XmlSerializer 在反序列化时忽略元素

本文关键字:元素 反序列化 XmlSerializer | 更新日期: 2023-09-27 18:32:06

默认XmlSerializer(由Visual Studio自动提供)用于我的Web服务。 我只使用属性来标记方法[WebMethod]和对象[Serialize()]等。

有一个

对象在 Web 服务和客户端之间双向传递。

其中一名成员(public MyClassType MyClass ;)这个对象是单向的,一次只向客户端发送值。 如果客户端返回此成员集,我希望我的 Web 服务不反序列化它,以便反序列化的对象包含该成员的null值。

做了一些研究,如果我使用非XmlSerializer,那么我可以将"OnDeserialization"属性附加到对象内的方法上,以实现我需要的。

我试图避免这种潜在的情况。Web 服务将对象与成员集一起发送到客户端。 客户端按预期对成员执行操作。 客户端发回未清除成员 (NULLed) 的对象,因为它忘记了。 Web 服务执行一些额外的工作,并将相同的对象发回(可能略有修改),但成员的值未更改,因此不再是最新的,客户端应看到它的 NULL 值,以防止客户端再次对此未更改的成员执行操作。 Web 服务可以为客户端应再次操作的成员设置一个新值。

有没有类似的简单方法可以为XmlSerializer做到这一点?

C# XmlSerializer 在反序列化时忽略元素

执行此操作

的快速而肮脏的方法是在服务器端类上有一个代理属性,该属性返回当前值 MyClass ,但在设置时丢弃当前值:

    [XmlIgnore]
    public MyClassType MyClass { get; set; }
    [XmlElement("MyClass")]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
    public MyClassType GetMyClassForXml
    {
        get
        {
            return MyClass;
        }
        set
        {
            // DO NOTHING
        }
    }

然后用 [XmlIgnore] 标记"不动产"属性。

有关更复杂的解决方案,请参阅在不更改原始类的情况下在序列化期间排除某些属性。 请注意,使用 XmlAttributeOverrides 的答案不完整,因为序列化程序必须缓存在哈希表中以防止严重的内存泄漏。 有关此类哈希的示例,请检查 XML"系列化"和"排除基类"。

我想你正在寻找XmlIgnoreAttribute。

或者也许是"指定"后缀。