Вопрос

С 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?

Это было полезно?

Решение

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

Другие советы

Хотя это правда, как сказано в этот ответ к Ницмахон что определенный тип контракта данных не может иметь объявленные члены в нескольких пространствах имен, возможно, что в типе иерархия, производные типы могут принадлежать к пространствам имен контрактов данных, отличным от базовых типов, от которых они наследуются.Когда это произойдет, каждый член будет сериализован в пространство имен, в котором он находится. заявил.Построив соответствующую иерархию типов, сущности 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top