WCF REST:使用类“WITHOUT”装饰属性DataContract和DataMember的ReadAsDataContract

时间:2010-10-19 22:01:47

标签: c# wcf rest datacontractserializer

我刚刚完成了一些测试,并且我已经设法让ReadAsDataContract处理Response.Content方法......

真正令人困惑的是我认为它不应该工作!由于我的类没有使用DataContact或DataMember属性进行修饰。

我很困惑,阅读网络上的各种教程似乎用DataContract和DataMember属性装饰你的类(用于ReadAsDataContract)是很重要的。

但我的不是,我在调用ReadAsDataContract的行上放了一个断点,果然我有一个带有正确详细信息的LIST。这是行

List<Models.Question> questions = response.Content.ReadAsDataContract<List<Models.Question>>();

Models.Question未使用属性进行修饰。我与我的服务器和客户共享我的模型组件。

有人可以告诉我为什么它可行,据我所知你需要在类和成员上添加属性(我没有)

我正在使用Visual Studio 2010和.NET 4 - 我似乎记得不再需要这些属性 - 这是真的吗?

真的很期待任何帮助。

我讨厌它什么时候工作,他们不应该:-)但当然我也讨厌当它们不应该工作时,他们应该:-)

谢谢!

2 个答案:

答案 0 :(得分:3)

  

有人可以告诉我它为什么会起作用   据我所知你需要添加   类和成员的属性   (我没有)

将[DataContract]放在数据类上的“负担”和要序列化的每个成员的[DataMember]对全世界的程序员来说太过分了 - 所以微软改变了.NET 3.5 SP1中DataContractSerializer的行为。 / p>

从那时起,DCS的行为就像旧的XmlSerializer一样,没有装饰的类 - 它会愉快地序列化所有公共成员和属性。

问题当然是:您放弃了属性为您提供的所有附加控件,例如为数据协定定义XML命名空间,定义数据成员的顺序等等 - 但它可以在不添加任何属性的情况下工作

所以这是一个已知且自愿介绍的行为。我仍然相信你应该明确你的意图并用[DataContract]和你的成员用[DataMember]标记你的数据类(这也使你能够忽略一个或几个公共成员而不包括它们在序列化中)。 / p>

答案 1 :(得分:1)

根据this,所有类型都可以序列化,而不仅仅是具有DataContractAttribute的类型。