属性只能由Serializer设置

时间:2010-10-18 13:58:42

标签: c# xmlserializer

我有一个与API通信的类,需要对它接触的任何数据进行一些转换。这个类也是等价的:

public class SerializeMe
{
    public SerializeMe(string someString)
    {
        _someString = someString;
    }

    private string _someString;
    public string TransformedValue
    {
        get { _someString = TransformToSomething();
              return _someString; }
        set { _someString = value; }
    }
}

对于我的API调用者,我通过序列化这些类来记录每个请求和响应。它们几乎充当xml模式。

现在一切都很完美我唯一的问题是,理论上有人可以试着设定并最终没有得到预期的结果。它主要是一个设计问题,只是试图让我的代码负责。我希望能够使用私人套装,但XmlSerializer会抱怨它。

是否有属性或其他技术可以将转换后的值设置为不可设置,除非是序列化程序?

此外,如果没有选项,则将该属性设为Obsolete是一个选项。是否还有其他更适合使用的属性?

3 个答案:

答案 0 :(得分:2)

XmlSerializer开箱即用,但为了获得灵活性,您应该考虑使用IXmlSerializable界面。 XmlSerializer将查看该对象,如果它实现IXmlSerializable,它将调用该接口公开的对象上的方法。是的,这是更多的工作,但你有一个更细粒度的方法来解决你的对象如何被序列化。

答案 1 :(得分:2)

这对XmlSerializer来说很痛苦,可以使用DataContractSerialzer(它可以在没有XmlSerializer需要的无参数的ctor的情况下工作)。只需将类型标记为[DataContract],将字段(不是属性)标记为[DataMember]。

[DataContract]
public class SerializeMe
{
    public SerializeMe(string someString)
    {
        _someString = someString;
    }
    [DataMember]
    private string _someString;
    public string TransformedValue
    {
        get { _someString = TransformToSomething();
              return _someString; }
        private set { _someString = value; }
    }
}

答案 2 :(得分:0)

不幸的是,XmlSerializer只能使用公共getter / setter序列化属性(当然,除非您通过IXmlSerializable指定自己的序列化)。

我不时使用的唯一解决方法(这是一个hack并且不符合.NET设计指南所以我根本不喜欢这样做)有一个空的setter的公共属性然后使用另一种方法设置私有后备变量:

public class SerializeMe
{
    private string _someString;
    public string SomeString
    {
        get
        {
            _someString = TransformToSomething();
            return _someString;
        }
        set { }
    }

    public void SetString(string val) { _someString = val; }
}

显然IXmlSerializable是更多的工作,但从长远来看这肯定是一个更好的决定(更不用说它不是黑客的事实)。