Добавление DataMember в другое пространство имен в DataContract
-
19-09-2019 - |
Вопрос
С 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
Члены данных сериализуются в пространство имен контракта данных того типа элементов данных, в котором они объявлены.
Корневое пространство имен типа контракта данных — это пространство имен его наиболее производного типа.
XML-элементы (де)сериализуются в порядке, указанном Порядок элементов данных.
DataContractSerializer
не позволяет свободно переупорядочивать элементы данных во время десериализации.2Коллекции имеют свои собственные правила, как указано в Типы коллекций в контрактах данных;к ним этот ответ не относится.
Таким образом, 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 с помощью суррогат контракта данных механизм.