2009-09-22 50 views

回答

0

你正在使用哪个序列化程序?

  • DataContractSerializer的将 包括加载关系而不是 那些尚未加载/空。
  • 如果XmlSerializer是双向的(即实体A指向实体B,而实体B又指向后面),则XmlSerializer倾向于扼杀关系。
  • 二进制格式化器......我从来没有找到一个能够正确处理与其他实体有关系的L2S实体对象。因为我试过了,所以也许我只是做了错误的很长一段时间...
+0

我还没有决定串行然而,我希望他们中的一个有选择或默认情况下并没有试图在所有遍历关系属性。我打算先尝试System.Xml.Serialization.XmlSerializer。 – Maslow 2009-09-23 15:28:28

+0

好的。 DataContractSerializer是使用L2S生成的实体类的最佳选择。如果你想排除任何已经加载的关系,你需要将它们清空或者关联关联属性上的datamember属性... – KristoferA 2009-09-23 15:55:48

0

还有一点要添加到接受的答案:

的关系不属于集合将不会被DataContractSerializer的序列化(无论它们是否已加载),因为从.dbml文件中没有为它们生成DataMember属性。

I found here解释由当时在微软丹尼尔·西蒙斯:

这里的问题是,到SP1之前有真的DataContract序列没有好的办法来处理有周期的对象的图形。作为LINQ to SQL的一个结果,作出了折衷决定,允许用户选择单向序列化,并且仅序列化不引用的集合。如果你真的想要序列化一个引用(比如上面的场景),这种机制并不适用,但它至少可以帮助你解决一些常见的场景。

在SP1中向WCF添加了新的支持,该支持使DataContract序列化能够处理周期,但您必须通过更改DataContract的某些属性并可能对您的集合和引用类实现进行更改以正确处理序列化,特别是WCF的反序列化行为。在实体框架中进行了更改,以利用这些新功能,因为它尚未发布其第一个版本,但Linq to SQL仅在sp1中进行了小型服务包升级,并且未对其进行修改以利用此功能能力。

我还没有在L2S上做过这方面的实验,但是可能会生成自己的类,它们可以与L2S一起使用,并且可以正确支持带周期的WCF序列化。

丹尼