Добавление DataMember в другое пространство имен в DataContract - PullRequest
3 голосов
/ 10 ноября 2009

С помощью XmlSerializer мои члены могут находиться в разных пространствах имен родительского типа.

Могу ли я сделать то же самое с DataContractSerializer?

Я хотел бы следующий XML:

<h:Type xmlns:h="http://schemas.e.com/WebServices"
    xmlns="http://schemas.e.com/WebServices">
  <Member xmlns="http://schemas.e.com/CoreTypes">0</Member>
</h:Type>

Возможно ли это с DataContractSerializer?

Ответы [ 2 ]

1 голос
/ 10 ноября 2009

Вы можете определить поддоконтракты в разных пространствах имен и использовать их как элементы другого контракта данных, но вы не можете управлять именами и / или формами отдельных членов. DataContractSerializer не предназначен для замены XmlSerializer для детального контроля «формы» вашего XML.

0 голосов
/ 14 декабря 2018

Хотя в этом ответе от nitzmahone верно, что конкретный тип контракта данных не может иметь объявленных членов в нескольких пространствах имен, возможно, что в типе Иерархия , производные типы могут принадлежать к другим пространствам имен контракта данных, чем базовые типы, от которых они наследуются. Когда это происходит, каждый член сериализуется в пространство имен, в котором он объявлен . Путем построения соответствующей иерархии типов сущности XML с членами в разнородных пространствах имен можно (де) сериализовать как DataContractSerializer.

Конкретные правила заключаются в следующем:

  1. Если тип контракта данных является частью иерархии наследования, члены данных его базовых типов всегда располагаются первыми в порядке. 1

  2. Элементы данных сериализуются в пространство имен контракта данных того типа элемента данных, в котором они объявлены.

  3. Корневое пространство имен типа контракта данных - это пространство имен его наиболее производного типа.

  4. XML-элементы (де) сериализуются в порядке, указанном в Порядок элементов данных . DataContractSerializer не позволяет свободно переупорядочивать элементы данных во время десериализации. 2

  5. Собрания имеют свои собственные правила, указанные в Типы собраний в контрактах на данные ; этот ответ к ним не относится.

Таким образом, XML в вопросе может быть использован DerivedType в следующей иерархии типов:

[DataContract(Name = "Base", Namespace = "http://schemas.e.com/CoreTypes")]
public class BaseType
{
    [DataMember]
    public int Member { get; set; }
}

[DataContract(Name = "Type", Namespace = "http://schemas.e.com/WebServices")]
public class DerivedType : BaseType
{
}

И, как правило, любая последовательность элементов XML в любой последовательности пространств имен может быть получена путем применения приведенных выше правил для создания соответствующей иерархии типов, предлагая обходной путь, который отвечает требованию десериализации элементов в различных пространствах имен.

Конечно, такая иерархия может быть неудобной по другим причинам, и в этом случае предпочтительные типы моделей данных могут быть заменены на DTO с использованием механизма суррогата контракта данных .


1 Порядок членов данных .

2 Порядок членов данных и десериализация XML

...