问题描述
|
事情有多糟:
public class Test
{
private string pKey = null;
public string Key {
get { return pKey; }
set { if (pKey==null) pKey=value;}
}
}
这将使我可以在类中使用XMLSerializer
,并确保initially2ѭ在初始设置后不能更改。
解决方法
我同意我最初的想法不好。
我现在知道没有办法使用标准XML序列化程序来实现这一点。 \'ssg \'建议不会被序列化,因为它没有公共设置器。
这里唯一的选择是实现
IXmlSerializable
,或使用其他序列化方法,例如DataContractSerializer
。前者的问题在于,该类的每个派生类也必须实现IXmlSerializable
;后者的问题是您不能使用属性或对生成的XML进行过多控制。
, 不好,请考虑:
test.pKey = null;
test.Key = \'my new key\';
我设法避开了您的保护(显然,您可以在set方法中添加null
支票以解决此问题)。
如果反序列化的对象具有null
密钥,则可能会发生相同的问题,该密钥仍可在首次访问它时进行设置。似乎,如果您需要这种保护,则可能应该考虑另一种获取它的方法。 。
XMLSerializer
对您使用的班级设置了限制,并且尝试解决这些限制,可能会引起混乱。如果您是一个单人商店,并且是唯一查看代码的人,那么这可能不是问题(至少要等几个月后才离开代码),但是在多开发人员中环境您班上的行为很可能引起混乱。例如,您通过不抛出异常来隐藏赋值无效,因此赋值操作将编译并运行,但不会更新对象且不会抛出异常以指示失败(这可能导致某些情况难以跟踪错误)。