具有[DataContract]属性的类是否不会自动序列化? 如果不是,是否需要使用[Serializable]属性(或从ISerialize继承)?WCF DataContract需要序列化?
我问这是因为我有一个来自以前项目的旧代码,显然[DataContract]类没有提及任何关于序列化的明确内容。
最终的问题: 我想要一个WCF操作(方法)返回一个DataContract类。 该方法是否必须在返回它之前显式序列化该类,还是自动序列化?我一直认为这将是后者。
谢谢!
具有[DataContract]属性的类是否不会自动序列化? 如果不是,是否需要使用[Serializable]属性(或从ISerialize继承)?WCF DataContract需要序列化?
我问这是因为我有一个来自以前项目的旧代码,显然[DataContract]类没有提及任何关于序列化的明确内容。
最终的问题: 我想要一个WCF操作(方法)返回一个DataContract类。 该方法是否必须在返回它之前显式序列化该类,还是自动序列化?我一直认为这将是后者。
谢谢!
不,[Serializable]
在数据合同中是不需要的。 XML序列化也不是必需的。
在.NET中有几个序列化选项。 SerializableAttribute和ISerializable可以回到开头,并由BinaryFormatter,SoapFormatter等使用。
DataContractSerializer相对较新,可以支持使用SerializableAttribute定义其序列化能力的对象,但这不是必需的。如果您只是使用DataContractSerializer序列化对象,那么只需使用数据协定属性即可。
显然,标记为可序列化的成员也必须是可序列化的类型。请参阅Types Supported by the Data Contract Serializer。
因此,DataContract属性看起来像是告诉它首先使用DataContractSerializer。 – AlvinfromDiaspar 2010-12-16 17:11:04
@Alvin:不,数据合约序列化程序是默认的。 – 2010-12-16 19:32:09
只需添加到此,DataContractSerializer支持的远不止DataContract类型。看到这篇出色的博客文章,详细介绍了DataContractSerializer支持的整个类型范围:http://blogs.msdn.com/b/sowmy/archive/2006/02/22/536747.aspx
因此,从一个WCF方法内,我可以返回一个DataContract类型的对象,而无需在返回时在xml中手动序列化?换句话说,我可以简单地返回DataContract对象,它将被xml序列化,对吧? – AlvinfromDiaspar 2010-12-16 17:26:55
@Alvin:没错。我建议你在Visual Studio中创建一个新的WCF服务,并查看它创建的代码。它完全是这样。 – 2010-12-16 19:31:51