如何从C#更改命名空间

时间:2012-02-27 09:20:36

标签: .net wcf

我有以下代码

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

我如何装饰DataContract属性,或者我必须在服务器端更改以将代码更改为

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

并且所有现有客户端都可以毫无问题地连接到此客户端。

注意:我无法在服务器端更改任何客户端。

2 个答案:

答案 0 :(得分: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 :(得分:1)

服务器和客户端使用不同的dll和定义。这显然是正确的,因为它们位于不同的机器上。

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

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