2012-02-27 35 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