Serialization 将DataMember添加到DataContract的其他命名空间

Serialization 将DataMember添加到DataContract的其他命名空间,serialization,namespaces,datacontract,datacontractserializer,datamember,Serialization,Namespaces,Datacontract,Datacontractserializer,Datamember,使用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</Memb

使用
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>

0

这在使用
DataContractSerializer
时可能吗?

您可以在不同的命名空间中定义子datacontract,并将其用作另一个datacontract的成员,但无法控制单个成员名称和/或形状。
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元素序列,从而提供一种解决方案,满足对不同名称空间中的元素进行反序列化的要求

    当然,由于其他原因,这种层次结构可能不方便,在这种情况下,可以使用该机制替换首选的数据模型类型


    一,


    2

    那么你是说这件事做不到吗?或者它可以,但不应该。我应该继续使用XmlSerializer吗?基本上。DataContracts并不是为精细控制而设计的——当管道的两侧都是WCF时,它们是为了“快速、简单和可重复”。XmlSerializer和WCF相处得很好-默认情况下它只使用DataContractSerializer。