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