3

我有一个与 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 抱怨它。

除了序列化程序之外,是否有属性或其他技术能够使转换后的值不可设置?

此外,如果没有选项,则可以选择将属性设置为过时。还有其他更合适的属性可以使用吗?

4

3 回答 3

2

XmlSerializer 做了很多开箱即用的工作,但要获得灵活性,您应该考虑使用IXmlSerializable接口。XmlSerializer 将查看对象,如果它实现了 IXmlSerializable,它将调用接口公开的对象上的方法。是的,它需要做更多的工作,但是对于如何反序列化/序列化对象,您有更细粒度的方法。

于 2010-10-18T14:08:36.950 回答
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; }
    }
}
于 2010-10-18T14:48:38.430 回答
0

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

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

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

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

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

于 2010-10-18T14:08:19.930 回答