增加一个数据成员以不同的名字空间的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
?
解决方案
你可以定义subdatacontracts在不同的名字空间,并利用它们作为成员的另一个datacontract,但是你不能控制的个人成员名称和/或形状。的 DataContractSerializer
是不是打算代替 XmlSerializer
为细化的控制"状态"的XML。
其他提示
虽然这是真如 这个答案 通过 nitzmahone 一个具体的数据合同类型不能已经宣布成员在多个名字空间,可能的是,在一个类型 层级结构, 衍生的类型可以分属不同的数据合同名称空间于基类型从它们的继承。当发生这种情况,每个成员将被列化的进入空间,其中它是 宣布.通过建立一个适当的层次结构,XML实体与成员在不同的名字空间,可以(de)化通过 DataContractSerializer
.
具体规则如下:
如果一个数据合同类型的一部分继承层次结构、数据的成员,其基类型总是在第一顺序。1
数据成员都化成数据的合同的名字空间数据的部件的类型,它们在其中宣布。
根名字空间数据合同类型的名字空间的大多数源类型。
XML元(de)化在指定的顺序 数据成员了.
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元素中的任何序列的namespace(s)可以获得通过应用上述规则,以构建一个适当的层次结构,提供一个解决办法,这符合要求的反序列化元素在不同的名称空间。
当然,这样一个层次结构,可能不便于其他原因,在这种情况下的首选模型数据类型可以被替换 交互 通过使用 数据合同代理 机构。
1 数据成员了.