2012-02-27 34 views
1

命名空间,我有以下代码如何改变从C#

namespace A 
{ 
    [DataContract] 
    public class CustomClass {} 
} 

我怎么能装饰DataContract属性,或者我必须改变在服务器端更改代码为

namespace B 
{ 
    [DataContract(...)] 
    public class CustomClass {} 
} 

和所有现有客户端都可以毫无问题地连接到该客户端

注:我不能更改任何客户端,只能在服务器端。

回答

3

这取决于你正在使用什么绑定(更具体地说,是哪个序列化程序)。如果您使用的是DataContractSerializer,那么答案很简单:什么都不做。这两份合同是等同的;

  • 明确的名称[DataContract(...)],如果一个 - 否则类名称(匹配)
  • [DataContract(...)]

明确的XML命名空间如果您正在使用NetDataContractSerializer:该线数据是通过定义,简单:你不能。

请注意,客户端使用的c#名称空间完全取决于客户端,并且通常由用于生成类型的工具确定。坦率地说,只要客户端使用基于合同的串行器(如XmlSerializerDataContractSerializer),那么客户端用作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

服务器和客户端使用不同的DLL和定义。这显然是真的,因为他们在不同的机器上。

因此,如果客户端在命名空间A中定义了服务器接口,它将保持这种状态。因为它只是一个告诉客户如何调用服务器的接口定义。

在服务器中,您可以根据需要更改命名空间,但不会影响客户端。

+0

在这种情况下,我相信你是正确的 - 但是,它不是“显然是真实的” - 可以在WCF使用的库中共享DTO类型 – 2012-02-27 09:32:23