2013-06-12 46 views
1

我有兩個DataContract s,我使用DataContractSerializer序列化爲XML。更改DataMember的XML命名空間

我爲兩個不同的DataContract s指定了不同的名稱空間,但是,每個DataContract中都有一個DataMember,它們具有相同的POD類型。該POD位於不同的c#名稱空間中。

我想知道是否有一種方法來指定這個DataMember使用的名稱空間,具體取決於它屬於哪個包含類型。

例如:

namespace NamespaceShared 
{ 
    using System.Runtime.Serialization; 

    [DataContract] 
    public sealed class SharedType 
    { 
     [DataMember(IsRequired = true)] 
     public int ValueOne { get; set; } 

     [DataMember(IsRequired = true)] 
     public int ValueTwo { get; set; } 
    } 
} 

namespace NamespaceOne 
{ 
    using System.Runtime.Serialization; 
    using NamespaceShared; 

    [DataContract(Namespace = "http://namespace.one")] 
    public sealed class DataContractOne 
    { 
     [DataMember(IsRequired = true)] 
     //[SomeNamespaceAttribute("http://namespace.one")] 
     private SharedType SharedValue { get; set; } 
    } 
} 

namespace NamespaceTwo 
{ 
    using System.Runtime.Serialization; 
    using NamespaceShared; 

    [DataContract(Namespace = "http://namespace.two")] 
    public sealed class DataContractTwo 
    { 
     [DataMember(IsRequired = true)] 
     //[SomeNamespaceAttribute("http://namespace.two")] 
     private SharedType SharedValue { get; set; } 
    } 
} 

我在尋找一些東西,會在代碼中提供的SomeNamespaceAttribute功能之上。

注意:我不在尋找關於如何更好地組織我的DataContract s的建議,因爲不幸的是我正在重構遺留代碼,並且XML格式無法更改。

+0

是否可以切換到XmlSerializer? XmlElementAttribute有一個選項來指定命名空間。 –

+0

不幸的不是。但是,謝謝你指出這一點。 – Nick

+0

想要更改命名空間的原因是什麼?你想改變什麼? –

回答

1

DataContractSerializer沒有公開作爲對XML生成的細粒度控制,所以這種屬性不是固有的。但是,您可以對共享類進行子類化(假定您可以刪除sealed訪問修飾符),並使用具有不同名稱空間的兩個不同DataContract屬性。

namespace NamespaceShared 
{ 
    using System.Runtime.Serialization; 

    public class SharedType 
    { 
     [DataMember(IsRequired = true)] 
     public int ValueOne { get; set; } 

     [DataMember(IsRequired = true)] 
     public int ValueTwo { get; set; } 
    } 

    [DataContract(Namespace = "http://namespace.one")] 
    public class SharedTypeOne : SharedType 
    { 
    } 

    [DataContract(Namespace = "http://namespace.two")] 
    public class SharedTypeTwo : SharedType 
    { 
    } 
} 

namespace NamespaceOne 
{ 
    using System.Runtime.Serialization; 
    using NamespaceShared; 

    [DataContract(Namespace = "http://namespace.one")] 
    public sealed class DataContractOne 
    { 
     [DataMember(IsRequired = true)] 
     private SharedTypeOne SharedValue { get; set; } 
    } 
} 

namespace NamespaceTwo 
{ 
    using System.Runtime.Serialization; 
    using NamespaceShared; 

    [DataContract(Namespace = "http://namespace.two")] 
    public sealed class DataContractTwo 
    { 
     [DataMember(IsRequired = true)] 
     private SharedTypeTwo SharedValue { get; set; } 
    } 
} 

如果一切都失敗了,你可以編輯原始XML使用類似於它是用來改變自動生成的前綴的技術出來的服務。 This MSDN blog post詳細介紹了整個過程。

+0

尚未解決問題,但可能是正確的答案。 – Nick