我有一个与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是一个选项。是否还有其他更适合使用的属性?
答案 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
是更多的工作,但从长远来看这肯定是一个更好的决定(更不用说它不是黑客的事实)。