我正在写WCF服务和他的客户端 . 我想在服务和客户端之间发送/接收我的自定义类的对象 .
我有3个模块
WCF服务
WCF客户端
公共类库
WCF服务和客户端都引用了公共类库 . 我不想用DataContract属性标记我的所有类 .
所以,我的问题是“WCF需要DataContract属性吗?”
我使用.NET 4和netTcpBinding .
如果我没记错(IIRC),如果你不使用正式的数据合约标记,它默认就像一个字段序列化器 . 这样可以工作,但版本不太容易,因为私有更改可能会破坏客户端/服务器 . IMO您应该始终使用data-contract / data-member属性正式装饰WCF类型 . 它会在没有它们的情况下工作,但出于错误的原因(IIRC,最初它没有正式标记就行不通) .
“WCF需要DataContract属性”
从技术上讲,没有 . 这取决于您是否使用DataContractSerializer(这是许多绑定的默认设置) .
还有其他选择:
考虑替代序列化程序
尝试使用Data Contract Surrogates(某些地方仍然需要属性,但这可能意味着你可以保持你的课程不受影响,如果那是相关的)
当您序列化没有数据合约属性的类时,依赖于serialization defaults
你可以在WCF中使用几种串行技术,它是关于它的一个很好的适应性事物 . 看一看:
http://msdn.microsoft.com/en-us/magazine/cc163569.aspx
它不需要使用DataContract属性,没有它们,您的服务将正常工作 .
话虽如此,我真的不认为让你的服务和客户共享一个类库是最好的设计方法 . 如果你通过DataContracts暴露你的类型会更清楚 .
有一天,有人想要使用您的服务但却无法访问共享类库会发生什么?
4 回答
如果我没记错(IIRC),如果你不使用正式的数据合约标记,它默认就像一个字段序列化器 . 这样可以工作,但版本不太容易,因为私有更改可能会破坏客户端/服务器 . IMO您应该始终使用data-contract / data-member属性正式装饰WCF类型 . 它会在没有它们的情况下工作,但出于错误的原因(IIRC,最初它没有正式标记就行不通) .
从技术上讲,没有 . 这取决于您是否使用DataContractSerializer(这是许多绑定的默认设置) .
还有其他选择:
考虑替代序列化程序
尝试使用Data Contract Surrogates(某些地方仍然需要属性,但这可能意味着你可以保持你的课程不受影响,如果那是相关的)
当您序列化没有数据合约属性的类时,依赖于serialization defaults
你可以在WCF中使用几种串行技术,它是关于它的一个很好的适应性事物 . 看一看:
http://msdn.microsoft.com/en-us/magazine/cc163569.aspx
它不需要使用DataContract属性,没有它们,您的服务将正常工作 .
话虽如此,我真的不认为让你的服务和客户共享一个类库是最好的设计方法 . 如果你通过DataContracts暴露你的类型会更清楚 .
有一天,有人想要使用您的服务但却无法访问共享类库会发生什么?