C# System.Runtime.Serialization.InvalidDataContractException:属性没有设置方法
错误显示我的属性没有setter,但我不想要setter,它应该是只读的。编辑:将setterC# System.Runtime.Serialization.InvalidDataContractException:属性没有设置方法,c#,wcf,C#,Wcf,错误显示我的属性没有setter,但我不想要setter,它应该是只读的。编辑:将setter设置为内部的 这仍然可以在程序集中设置,但在其他人使用的程序集中的数据对象上使用时,这是一个很好的技巧,因为那些使用程序集的人将无法设置属性,但是各种序列化程序都可以。请记住,WCF需要从其序列化表示(通常是XML)创建对象的实例,如果属性没有setter,则无法赋值。对象不是在客户端和服务器之间传输的,而是序列化的表示形式,因此需要在每一端重建对象。您的问题有点模糊,但我想这就是您要寻找的答案: 默认
设置为内部的
这仍然可以在程序集中设置,但在其他人使用的程序集中的数据对象上使用时,这是一个很好的技巧,因为那些使用程序集的人将无法设置属性,但是各种序列化程序都可以。请记住,WCF需要从其序列化表示(通常是XML)创建对象的实例,如果属性没有setter,则无法赋值。对象不是在客户端和服务器之间传输的,而是序列化的表示形式,因此需要在每一端重建对象。您的问题有点模糊,但我想这就是您要寻找的答案: 默认序列化仅适用于读写属性,因为在不设置属性值的情况下无法对对象进行重新水化。如果希望它与只读属性一起工作,则需要自己实现序列化接口,而不仅仅是添加属性
假设您使用的是DataContract序列化,我认为最好的选择是实现ISerializable并自己实现这些方法。Protected不允许从类外部设置属性,因此反序列化仍然会失败…@Dan-请检查我的编辑。我知道我以前遇到过这个问题,但我必须回去看看我是如何处理的。你是对的-我最初尝试保护,但发现它不起作用,所以改用内部。谢谢大家!!!我选择了另一种方式:set{Throw new Exception(“您不能为这个属性设置值”)}感谢您的输入和帮助Slugster@slugster-从代码的角度来看,我仍然对内部工作感到惊讶(因为序列化程序仍然不能从程序集外部看到该成员!),但知道这一点很好@Qutbuddin:您应该测试您的方法,因为我怀疑您会发现该属性(可能还有该类)中的数据不会跨越连接,因为反序列化会引发异常。这是否回答了您的问题?