0

谁能解释如何控制生成的 XML?

我有一个简单的测试类 NumberService ...

[Serializable]
public class NumberService
{
    public int Number1 { get; set; }
    public int Number2 { get; set; }
}

现在,如果我使用 XmlSerializer 反序列化一个实例,我会得到我所期望的......

<NumberService>
  <Number1>23</Number1>
  <Number2>45</Number2>
</NumberService>

但我正试图发送这个,而 Fiddler 正在显示......

<NumberService>
<_x003C_Number1_x003E_k__BackingField>10</_x003C_Number1_x003E_k__BackingField>
<_x003C_Number2_x003E_k__BackingField>2</_x003C_Number2_x003E_k__BackingField>
</NumberService>

四处闲逛我读到这是因为我使用了自动属性,实际上如果我改为......

public class NumberService
{
    private int _number1;
    public int Number1
    {
        get { return _number1; }
        set { _number1 = value; }
    }

    public int Number2 { get; set; }
}

确实 XML 更改为...

<NumberService>
<_number1>4</_number1>
<_x003C_Number2_x003E_k__BackingField>6</_x003C_Number2_x003E_k__BackingField>
</NumberService>

但是我当然不能将 _number1 更改为 Number1,因为它会与属性冲突:-(

那么如何控制 XML 呢?

......还有一点阅读......

这涉及 WCF 数据合同

4

3 回答 3

2

这与DataContractSerializer如何处理应用了Serializable 属性的项目有关。

当遇到 Serializable 属性时,DataContractSerializer 将遵循您在将实例与IFormatter实现一起使用时所期望的语义;换句话说,它将使用字段名称作为数据的键来序列化底层字段。

因为您使用的是自动生成的属性,所以您看到的实际上是编译器为您生成的自动生成字段的名称。

为了解决这个问题,您应该将DataContract 属性应用于类并将DataMember 属性应用于属性(如果您希望它与属性名称不同,您可以通过在属性中指定它来控制名称)。

您还可以选择根本不指定 DataContract/DataMember 属性并使用POCO DataContract 序列化;这假设您有一个默认的无参数构造函数以及仅序列化公共属性/字段。

于 2010-11-29T20:18:14.207 回答
1

您应该删除该[Serializable]属性。XML 序列化不使用它,它向 Data Contract Serializer 提供错误消息。

于 2010-11-29T21:14:56.760 回答
0

如果您仅使用 XmlSerialization,则可以使用System.Xml.Serialization命名空间中的属性来控制 Xml-Serialization,例如XmlAttributeAttribute

如果您想在 Wcf 服务中使用DataContractSerializer,则需要使用 DataContract 属性标记您的类,并使用 DataMember 属性标记所有属性。

恕我直言,DataContractSerializer 比旧的 XmlSerialization 先进得多

于 2010-11-29T20:14:12.693 回答