DataContractSerializer

DataContractSerializer

使用DataContractSerializer序列化我的对象,我得到类似于以下内容的输出

 <?xml version="1.0" encoding="utf-8" ?>
 <AgentNotification xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/The.name.space.Notifications">
  <_x003C_Created_x003E_k__BackingField i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/The.name.space" />
  <_x003C_Id_x003E_k__BackingField i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/The.name.space" />
 <_x003C_Email_x003E_k__BackingField>[email protected]</_x003C_Email_x003E_k__BackingField>
  <_x003C_Name_x003E_k__BackingField>Random Person</_x003C_Name_x003E_k__BackingField>
 <_x003C_Policies_x003E_k__BackingField>
 <PolicyNotification>
  <_x003C_Created_x003E_k__BackingField i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/The.name.space" />
  <_x003C_Id_x003E_k__BackingField i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/The.name.space" />
  <_x003C_ConfirmationNumber_x003E_k__BackingField>Some number</_x003C_ConfirmationNumber_x003E_k__BackingField>
  </PolicyNotification>
 <PolicyNotification>
  </_x003C_Policies_x003E_k__BackingField>
  </AgentNotification>

有什么办法可以输出只是
<Id>
<Name>

等等,而无需使用属性覆盖我的类(class)?

如果没有办法保证每次正确输出都是一样的?这样一来,如果我使用它来呈现对象图,那么它就是XML,可以与X *文档混搭在一起生成文件,而我却再也不会遇到节点更改名称而文档空白的问题了吗?

最佳答案

发生这种情况是因为您必须使用 AgentNotification 标记了您的类型(例如[Serializable])。当DataContractSerializer遇到标有[Serializable]但没有显式 [DataContract] 的类型时,它将为该类型生成default contract,该类型与 BinaryFormatter 序列化类的方式匹配,即按名称序列化all member variables of a class — even variables marked as private。对于auto-implemented properties,这意味着secret backing fields按名称序列化;它们的名称是您看到的特殊元素名称。

解决此问题的最简单方法是从类中删除[Serializable]属性。除非您实际上正在使用BinaryFormatter SoapFormatter ,否则几乎可以肯定不需要它。这样做之后,DataContractSerializer现在将按名称序列化您的公共(public)属性和字段,而不是按名称序列化公共(public)和私有(private)字段。

10-01 12:38