C# 控制为自动属性生成的XML

C# 控制为自动属性生成的XML,c#,xml,properties,xml-serialization,automatic-properties,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<

有人能解释一下如何控制生成的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>
事实上,XML变为

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

4.
6.
但我当然不能将_number1改为number1,因为它与属性冲突:-(

那么,如何控制XML呢

…还有更多的阅读


这涉及到WCF数据契约

如果您只使用XmlSerialization,那么您可以使用命名空间中的属性来控制Xml序列化

如果希望在Wcf服务中使用,则需要使用DataContract属性标记类,并使用DataMember属性标记所有属性


IMHO DataContractSerializer比旧的XmlSerialization高级得多。例如,如果您只使用XmlSerialization,则可以使用命名空间中的属性来控制Xml序列化

如果希望在Wcf服务中使用,则需要使用DataContract属性标记类,并使用DataMember属性标记所有属性


IMHO DataContractSerializer比旧的XmlSerialization高级得多,这与应用程序如何处理项有关

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

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

为了避免这种情况,您应该将应用于类,将应用于属性(如果希望名称与属性名称不同,您可以通过在属性中指定名称来控制名称)


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

这与如何使用应用的属性处理项有关

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

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

为了避免这种情况,您应该将应用于类,将应用于属性(如果希望名称与属性名称不同,您可以通过在属性中指定名称来控制名称)


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

您应该删除
[Serializable]
属性。XML序列化没有使用该属性,它向数据协定序列化程序提供了错误的消息。

您应该删除
[Serializable]
属性。XML序列化没有使用该属性,它向数据协定序列化程序提供了错误的消息

“现在,如果我使用XmlSerializer来反序列化一个实例,我会得到我所期望的…
”你是说序列化吗?我认为序列化(在本文中)是将内存数据结构编码为XML的过程。呃…检查…不,我的意思是使用(var streamWriter=File.CreateText(f)){serializer.serialize进行序列化(streamWriter,n);}那么这是序列化还是反序列化???我以为从实例生成XML就是在序列化它!“现在如果我使用XmlSerializer反序列化实例,我得到了我所期望的…
“你是指序列化吗?我认为序列化(在本文中)是将内存数据结构编码为XML.Err…checking…no的过程,我的意思是使用(var streamWriter=File.CreateText(f)){serializer.Serialize(streamWriter,n);}那么这是序列化还是反序列化呢???我以为从实例生成XML就是序列化它!Spot on…删除了该属性,甚至没有[DataContract]和[DataMember]属性,我在Fiddler中获得了预期的格式。因此,这可以追溯到casperOne关于POCO DataContract序列化的链接…每天我都会了解更多关于…删除该属性,甚至没有[DataContract]和[DataMember]属性,我在Fiddler中得到了预期的格式。因此,这可以追溯到casperOne关于POCO DataContract序列化的链接……每天我都能学到更多
public class NumberService
{
    private int _number1;
    public int Number1
    {
        get { return _number1; }
        set { _number1 = value; }
    }

    public int Number2 { get; set; }
}
<NumberService>
<_number1>4</_number1>
<_x003C_Number2_x003E_k__BackingField>6</_x003C_Number2_x003E_k__BackingField>
</NumberService>