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