我有以下代码
namespace A
{
[DataContract]
public class CustomClass {}
}
我如何装饰DataContract属性,或者我必须在服务器端更改以将代码更改为
namespace B
{
[DataContract(...)]
public class CustomClass {}
}
并且所有现有客户端都可以毫无问题地连接到此客户端。
注意:我无法在服务器端更改任何客户端。
答案 0 :(得分:3)
这取决于您使用的绑定(更具体地说,是哪个序列化程序)。如果您使用DataContractSerializer
,那么答案很简单:什么都不做。这两份合同是等价的;有线数据由:
[DataContract(...)]
中的显式名称(如果有) - 否则是类名(匹配)[DataContract(...)]
如果您使用NetDataContractSerializer
,那么简单:您不能。
请注意,客户端使用的c#命名空间完全取决于客户端,通常由用于生成类型的工具确定。坦率地说,只要客户端使用基于合同的序列化程序(例如XmlSerializer
或DataContractSerializer
),客户端使用什么作为c#名称空间并不重要。
为了说明这一点:这两次打印相同的东西:
using System.Runtime.Serialization;
using System;
namespace A
{
[DataContract] class Foo { }
}
namespace B
{
[DataContract] class Foo { }
}
static class Program
{
static void Main()
{
new DataContractSerializer(typeof (A.Foo)).WriteObject(
Console.OpenStandardOutput(), new A.Foo());
Console.WriteLine();
new DataContractSerializer(typeof (B.Foo)).WriteObject(
Console.OpenStandardOutput(), new B.Foo());
}
}
答案 1 :(得分:1)
服务器和客户端使用不同的dll和定义。这显然是正确的,因为它们位于不同的机器上。
因此,如果客户端在命名空间 A 中定义了服务器的接口,那么它将保持这种状态。因为它只是一个接口定义,告诉客户端如何调用服务器。
在服务器中,您可以根据需要更改命名空间,它不会影响客户端。