11

Using the DataContractSerializer to serialize my object I get an output similar to

 <?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>

Is there any way for it to output tags that are just

<Id>
<Name>

etc, without the need to cover my classes with attributes?

If there's not a way the output of this is guaranteed to be the same every time correct? So that if I use this to render my object graphs are XML to mash up with an X* document for file generation that I'll never run into an issue where my nodes change names and the document comes out blank correct?

4

4 回答 4

9

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

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

于 2015-07-19T07:28:59.513 回答
5

当您使用自动属性时,长元素名称(例如 _x003C_Created_x003E_k__BackingField)由 .NET 创建。

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

(除此之外,只需将 [DataContract] 属性添加到您的类定义中就可以大量整理您的 XML ——尽管不完全。)

于 2010-02-23T03:52:48.880 回答
1

DataContractSerializer序列化所有公共属性(如果您未指定任何内容 - 从 .NET 3.5 SP1 开始可能),或者(我更喜欢的方法)您使用 [DataMember] 属性标记的任何内容。

因此,您能做的最好的事情就是用属性标记您的类[DataContract],并用属性标记您在数据协定中真正想要的所有成员(属性、字段等)[DataMember]

DataContractSerializer 实际上并没有比这更多的控制 - 您可以非常清楚地定义(使用这种明确的“选择加入”方法)什么被序列化,但是您几乎无法控制它如何被序列化。

但你真的需要吗?真的吗?

如果是这样,您可能不得不将 XmlSerializer 用于该序列化过程 - 在那里您可以更好地控制事物的序列化方式(但作为一个缺点,XmlSerializer 将序列化每个未明确标记的公共属性[XmlIgnore]属性 - “选择退出”计划)。

查看 Dan Rigsby 的博客文章,了解 DataContractSerializer 和 XmlSerializer 之间的区别以及它们各自提供的功能。

于 2009-12-23T17:04:38.817 回答
0

我终于遇到了同样的麻烦,所以你只需要在模型中添加[DataContract]和[DataMember]。

于 2015-03-25T08:49:44.507 回答