3

有了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>

这可能在 with 中DataContractSerializer吗?

4

2 回答 2

1

您可以在不同的命名空间中定义子数据合同并将它们用作另一个数据合同的成员,但您无法控制各个成员的名称和/或形状。DataContractSerializer不是为了替换对 XML的XmlSerializer“形状”的细粒度控制。

于 2009-11-10T05:12:49.597 回答
0

虽然nitzmahone在这个答案中指出,特定数据协定类型不能在多个命名空间中声明成员,但在类型层次结构中,派生类型可能属于不同的数据协定命名空间,而不是基类型。他们继承。发生这种情况时,每个成员都将被序列化到声明它的命名空间中。通过构造适当的类型层次结构,具有不同名称空间中的成员的 XML 实体可以由.DataContractSerializer

具体规则如下:

  1. 如果数据协定类型是继承层次结构的一部分,则其基本类型的数据成员始终排在首位。1

  2. 数据成员被序列化到声明它们的数据成员类型的数据协定命名空间中。

  3. 数据协定类型的根命名空间是其最衍生类型的命名空间。

  4. XML 元素按照Data Member Order指定的顺序(反)序列化。 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反序列化

于 2018-12-14T03:24:54.823 回答