Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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# System.Runtime.Serialization.InvalidDataContractException:属性没有设置方法_C#_Wcf - Fatal编程技术网

C# System.Runtime.Serialization.InvalidDataContractException:属性没有设置方法

C# System.Runtime.Serialization.InvalidDataContractException:属性没有设置方法,c#,wcf,C#,Wcf,错误显示我的属性没有setter,但我不想要setter,它应该是只读的。编辑:将setter设置为内部的 这仍然可以在程序集中设置,但在其他人使用的程序集中的数据对象上使用时,这是一个很好的技巧,因为那些使用程序集的人将无法设置属性,但是各种序列化程序都可以。请记住,WCF需要从其序列化表示(通常是XML)创建对象的实例,如果属性没有setter,则无法赋值。对象不是在客户端和服务器之间传输的,而是序列化的表示形式,因此需要在每一端重建对象。您的问题有点模糊,但我想这就是您要寻找的答案: 默认

错误显示我的属性没有setter,但我不想要setter,它应该是只读的。

编辑:将setter
设置为内部的


这仍然可以在程序集中设置,但在其他人使用的程序集中的数据对象上使用时,这是一个很好的技巧,因为那些使用程序集的人将无法设置属性,但是各种序列化程序都可以。

请记住,WCF需要从其序列化表示(通常是XML)创建对象的实例,如果属性没有setter,则无法赋值。对象不是在客户端和服务器之间传输的,而是序列化的表示形式,因此需要在每一端重建对象。

您的问题有点模糊,但我想这就是您要寻找的答案:

默认序列化仅适用于读写属性,因为在不设置属性值的情况下无法对对象进行重新水化。如果希望它与只读属性一起工作,则需要自己实现序列化接口,而不仅仅是添加属性


假设您使用的是DataContract序列化,我认为最好的选择是实现ISerializable并自己实现这些方法。

Protected不允许从类外部设置属性,因此反序列化仍然会失败…@Dan-请检查我的编辑。我知道我以前遇到过这个问题,但我必须回去看看我是如何处理的。你是对的-我最初尝试保护,但发现它不起作用,所以改用内部。谢谢大家!!!我选择了另一种方式:set{Throw new Exception(“您不能为这个属性设置值”)}感谢您的输入和帮助Slugster@slugster-从代码的角度来看,我仍然对内部工作感到惊讶(因为序列化程序仍然不能从程序集外部看到该成员!),但知道这一点很好@Qutbuddin:您应该测试您的方法,因为我怀疑您会发现该属性(可能还有该类)中的数据不会跨越连接,因为反序列化会引发异常。这是否回答了您的问题?