2013-06-12 6 views
1

У меня есть два DataContract s, которые я сериализую в XML, используя DataContractSerializer.Изменение пространства имен XML для DataMember

Я указываю различное пространство имен для двух разных DataContract s, однако в каждом есть 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, потому что, к сожалению, я рефакторинг устаревшего кода, и формат 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

Смежные вопросы