控制为自动属性生成的XML

时间:2010-11-29 20:06:43

标签: c# xml properties xml-serialization automatic-properties

任何人都可以解释如何控制生成的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数据合同

3 个答案:

答案 0 :(得分:2)

这与DataContractSerializer如何处理已应用Serializable attribute的项目有关。

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

恕我直言DataContractSerializer比旧的XmlSerialization

更先进
相关问题