我正在尝试找出一种方法,使我的一些数据库对象可序列化到 XML 文件或从 XML 文件序列化。
我正在为我的对象使用 Entity Framework 数据模型,并使用 WCF RIA 服务使它们可供我的客户使用。我希望能够从数据库中获取给定对象并将其序列化为 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 设法序列化对象而不依赖于这些对象的设置,并且只有在将对象保存到 SQL 数据库后才分配 ID。
最佳答案
不熟悉 EF 和对象模型的工作方式,但对于大多数通过 WCF 成功序列化/反序列化的对象,您可以直接使用 DataContractSerializer。引用this article一个简单的演练。
由于您不需要 XML 可互操作,您也可以使用 preserveObjectReferences
设置来避免冗余数据。
关于c# - 使用序列化维护对象关系映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12267399/