我试图找到一种方法,使我的一些数据库对象可以与XML文件进行序列化。
我正在为我的对象使用Entity Framework数据模型,并使用WCF RIA Services将它们提供给我的客户端。我希望能够从数据库中获取给定对象并将其序列化为XML文件,反之亦然。
过去我试过这个,我遇到的问题如下:
如果我为每个对象实现IXmlSerializable,那么在反序列化时,每个对象都不知道被反序列化的其他对象。它处于一种气泡状态,无法将外键ID解析为对象引用。
对于上述问题,我发现的唯一解决方案是编写一个大的序列化和反序列化方法,其中父对象跟踪引用并根据需要分配它们。这感觉就像是一种非常糟糕的做法,因为我必须在对象发生变化时不断维护这个大型方法,而不是每个对象都负责自己的序列化。
嵌套对象在彼此内部的标准XML设计对ORM模型不起作用。原因是某些对象可能具有多个其他对象的引用并被其他对象使用,因此我无法将这些对象创建为父对象的子元素。
考虑以下XML:
<User Name="John Smith">
<FavoriteMovies>
<Movie Name="The Big Lebowski" Year="1998" ... />
</FavoriteMovies>
</User>
<User Name="Robert Jones">
<FavoriteMovies>
<Movie Name="The Big Lebowski" Year="1998" ... />
</FavoriteMovies>
</User>
显然,我不应该有同一部电影的两个实例。相反,序列化看起来应该是这样的:
<User Name="John Smith">
<FavoriteMovies>
<Id>5</Id>
</FavoriteMovies>
</User>
<User Name="Robert Jones">
<FavoriteMovies>
<Id>5</Id>
</FavoriteMovies>
</User>
<Movies>
<Movie Id="5" Name="The Big Lebowski" Year="1998" ... />
</Movies>
WCF已经知道如何将我的对象序列化和反序列化为SOAP / JSON /等。使用数据服务。这是我在序列化到XML文件时可以重复使用的东西吗?
在我看来,依赖于数据库外键ID可能无法工作,因为在许多情况下,对象将具有默认ID。 WCF设法序列化对象而不依赖于这些对象,并且ID仅在保存到SQL数据库后分配。
答案 0 :(得分:0)
不熟悉EF以及对象模型的工作原理,但对于通过WCF成功序列化/反序列化的大多数对象,您可以直接使用DataContractSerializer。有关简单的演练,请参阅this article。
由于您不需要XML可互操作,因此您也可以使用preserveObjectReferences
设置来避免冗余数据。
答案 1 :(得分:0)
我强烈推荐Json.NET
序列化程序http://json.codeplex.com/通过DataContractSerializer,只要后者有点错误。您还可以查看此问题,以获取有关Json.Net
序列化程序更好的原因的更多研究。