有没有办法让DataContractSerializer输出更清晰的XML?

Chr*_*sic 11 c# xml 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>some@email.com</_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>
Run Code Online (Sandbox Code Playgroud)

有没有办法输出正好的标签

<Id>
<Name>
Run Code Online (Sandbox Code Playgroud)

等,不需要用属性覆盖我的类?

如果没有办法,每次正确的输出保证是相同的?因此,如果我使用它来渲染我的对象图是XML与文件生成的X*文档混搭,我将永远不会遇到我的节点更改名称并且文档空白正确的问题?

dbc*_*dbc 9

发生这种情况是因为您必须使用标记您的类型(例如AgentNotification)[Serializable].当DataContractSerializer遇到标记[Serializable]但没有显式的类型时[DataContract],它会生成类型的默认契约,该类型与BinaryFormatter序列化类的方式相匹配,即按类名序序化类的所有成员变量 - 甚至标记为私有的变量.对于自动实现的属性,这意味着秘密支持字段按名称序列化; 他们的名字是你所看到的特殊元素名称.

解决此问题的最简单方法是[Serializable]从类中删除该属性.你几乎肯定不需要它,除非你实际使用BinaryFormatterSoapFormatter.完成此操作后,DataContractSerializer现在将按名称序列化您的公共属性和字段,而不是按名称序列化公共和私有字段.


Dav*_*ite 5

当您使用autoproperties时,.NET会创建长元素名称(例如,_x003C_Created_x003E_k__BackingField).

如果您将它们更改为具有支持字段的属性,则它们将使用您的支持字段名称.您可以在不向代码添加任何属性的情况下执行此操作.

(除此之外,只需在类定义中添加[DataContract]属性就可以大量整理XML - 尽管不完全.)