反序列化

时间:2016-01-27 00:09:05

标签: c# deserialization xmlserializer ignore

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

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

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

进行了一些研究,如果我使用非XmlSerializer,那么我可以附加一个" OnDeserialization"属性为对象中的一个方法,可以实现我的需要。

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

XmlSerializer是否有同样简单的方法?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

执行此操作的快速方法是在服务器端类上具有返回当前值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]的财产。

有关更复杂的解决方案,请参阅Excluding some properties during serialization without changing the original class。请注意,使用XmlAttributeOverrides的答案不完整,因为序列化程序must be cached in a hash table to prevent a severe memory leak。有关此类哈希的示例,请检查XMLSerialize and EXCLUDE the base class