Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# WCF是否需要DataContract属性_C#_.net_Wcf_Serialization - Fatal编程技术网

C# WCF是否需要DataContract属性

C# WCF是否需要DataContract属性,c#,.net,wcf,serialization,C#,.net,Wcf,Serialization,我在写WCF服务和他的客户。我想在服务和客户端之间发送/接收自定义类的对象 我有3个模块 WCF服务 WCF客户端 公共类库 WCF服务和客户端都有对公共类库的引用。 我不想用DataContract属性标记所有类 所以,我的问题是“WCF是否需要DataContract属性?” 我使用.NET 4和netTcpBinding。您可以在WCF中使用多种序列化技术,这是它很好的适应性之一。看看: 不需要使用DataContract属性,没有这些属性,您的服务就可以正常工作 话虽如此,我真的不认

我在写WCF服务和他的客户。我想在服务和客户端之间发送/接收自定义类的对象

我有3个模块

  • WCF服务
  • WCF客户端
  • 公共类库
WCF服务和客户端都有对公共类库的引用。 我不想用DataContract属性标记所有类

所以,我的问题是“WCF是否需要DataContract属性?”


我使用.NET 4和netTcpBinding。

您可以在WCF中使用多种序列化技术,这是它很好的适应性之一。看看:


不需要使用DataContract属性,没有这些属性,您的服务就可以正常工作

话虽如此,我真的不认为让您的服务和客户共享类库是最好的设计方法。如果您通过DataContracts公开您的类型,这将更加清晰

如果有一天,有人想使用您的服务,但无法访问共享类库,会发生什么情况?

如果我没记错(IIRC),如果您不使用正式的数据协定标记,它默认会像字段序列化程序一样工作。这会起作用,但版本不太容易,因为私有更改会破坏客户机/服务器。在我看来,您应该始终使用数据契约/数据成员属性正式地修饰WCF类型。没有它们它也能工作,但出于错误的原因(IIRC,最初没有正式的标记就不能工作)

“是否需要DataContract属性 世界粮食基金会“

从技术上讲,不是。这取决于是否使用DataContractSerializer(这是许多绑定的默认设置)

还有其他选择:

  • 考虑替代序列化程序
  • 尝试使用(属性在某些地方仍然是必需的,但这可能意味着你可以保持你的类不变,如果相关的话)
  • 当序列化没有数据协定属性的类时,请依赖for

  • 当服务有一个方法([OperationContract]),该方法有我的自定义类的参数,而该类没有默认构造函数时,我从WCF服务主机收到InvalidDataContractException。即使您的服务和客户端共享一个类库,WCF也将尝试序列化您的类型,为此它需要一个默认构造函数。您的设计违反了web服务设计的基本原则,我认为您最好使用其他类似.NET remoting.Retracted ContractDescription的建议。我怀疑您可以使用ContractDescription来更改序列化程序,该序列化程序以某种方式表示,默认情况下,合同中只包含公共读/写属性和字段。讽刺的是,读取堆栈溢出的答案需要引用缩写的含义