.net 如何从C更改名称空间

.net 如何从C更改名称空间,.net,wcf,.net,Wcf,我有以下代码 namespace A { [DataContract] public class CustomClass {} } 我如何修饰DataContract属性,或者我必须在服务器端更改什么才能将代码更改为 namespace B { [DataContract(...)] public class CustomClass {} } 和所有现有客户端连接到此客户端时不会出现问题 注意:我不能更改任何客户端,只能在服务器端更改。这取决于什么绑定,更具体

我有以下代码

namespace A
{
    [DataContract]
    public class CustomClass {}
}
我如何修饰DataContract属性,或者我必须在服务器端更改什么才能将代码更改为

namespace B
{
    [DataContract(...)]
    public class CustomClass {}
}
和所有现有客户端连接到此客户端时不会出现问题


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

这取决于什么绑定,更具体地说,取决于您使用的序列化程序。如果您使用的是DataContractSerializer,那么答案很简单:什么都不做。这两份合同是等价的;导线数据由以下各项定义:

[DataContract…]中的显式名称(如果有),否则为匹配的类名 [DataContract…]中的显式xml命名空间 如果您使用的是NetDataContractSerializer,很简单:您不能

请注意,客户端使用的c命名空间完全由客户端决定,并且通常由用于生成类型的工具确定。坦白地说,客户机使用什么作为c名称空间并不重要,只要他们使用基于契约的序列化程序,如XmlSerializer或DataContractSerializer

为了说明这一点:这会将相同的内容打印两次:

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());
    }
}

这取决于什么绑定,更具体地说,取决于您使用的序列化程序。如果您使用的是DataContractSerializer,那么答案很简单:什么都不做。这两份合同是等价的;导线数据由以下各项定义:

[DataContract…]中的显式名称(如果有),否则为匹配的类名 [DataContract…]中的显式xml命名空间 如果您使用的是NetDataContractSerializer,很简单:您不能

请注意,客户端使用的c命名空间完全由客户端决定,并且通常由用于生成类型的工具确定。坦白地说,客户机使用什么作为c名称空间并不重要,只要他们使用基于契约的序列化程序,如XmlSerializer或DataContractSerializer

为了说明这一点:这会将相同的内容打印两次:

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());
    }
}

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

因此,如果客户机在名称空间a中有服务器接口的定义,它将保持这种方式。因为它只是一个接口定义,告诉客户机如何调用服务器


在服务器中,您可以随意更改名称空间,而不会影响客户端。

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

因此,如果客户机在名称空间a中有服务器接口的定义,它将保持这种方式。因为它只是一个接口定义,告诉客户机如何调用服务器


在服务器中,您可以随意更改名称空间,并且不会影响客户端。

在这种情况下,我相信您是正确的-但是,这显然不是正确的-在WCF使用之间可以在库中共享DTO类型在这种情况下,我相信您是正确的-但是,这显然不是真的-在WCF用户之间共享库中的DTO类型是可能的