Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有序列化的上的伪只读属性_C#_Properties_Readonly_Xmlserializer - Fatal编程技术网

C# 具有序列化的上的伪只读属性

C# 具有序列化的上的伪只读属性,c#,properties,readonly,xmlserializer,C#,Properties,Readonly,Xmlserializer,有多糟糕 public class Test { private string pKey = null; public string Key { get { return pKey; } set { if (pKey==null) pKey=value;} } } 这将允许我在类中使用XMLSerializer,并确保初始设置后不能更改键。错误,请考虑: test.pKey = null; test.Key = 'my new ke

有多糟糕

public class Test
{
    private string pKey = null;
    public string Key { 
        get { return pKey; } 
        set { if (pKey==null) pKey=value;} 
    }
}
这将允许我在类中使用
XMLSerializer
,并确保初始设置后不能更改
键。

错误,请考虑:

test.pKey = null;
test.Key = 'my new key';
我已经设法绕过了您的保护(显然,您可以在set方法中添加一个
null
检查来修复此问题)

如果反序列化对象具有
null
键,则在第一次访问该键时仍可设置该键,则可能会出现相同的问题。。。似乎如果你需要这种保护,你应该考虑另一种方法


XMLSerializer
对使用它的类设置了限制,如果试图绕过这些限制,可能会造成混淆。如果您是一个人,并且您是唯一查看代码的人,那么这可能不是什么问题(至少在您离开代码几个月之前),但是在多开发人员环境中,您的类的行为可能会引起混乱。例如,您通过不引发异常来隐藏不起作用的分配,因此分配操作将编译并运行,但不会更新对象,也不会引发异常来指示失败(这可能导致一些难以追踪的bug)。

我同意我最初的想法是错误的

我现在知道,使用标准XML序列化程序无法实现这一点。”ssg的建议不会序列化,因为它没有公共setter


这里唯一的选择是实现
IXmlSerializable
,或者使用另一种序列化方法,如
DataContractSerializer
。前者的问题是类的每个派生也必须实现
IXmlSerializable
;后者的问题是,您不能使用属性或对生成的XML有很大的控制。

pKey应该是私有的吗?是的,pKey应该是私有的。我真正想要的是类似于
公共字符串密钥{get;private set;}
,但XmlSerializer不允许这样做。这应该会发生,并且如果尝试使用空值设置密钥,我可能会抛出一个异常(在我的代码中,这将被视为错误,所以我可以接受)。您可以使用每个属性的_isSetted布尔字段替换空异常。如果这成为你的问题。