【问题标题】:Maintaining object relational mapping with serialization使用序列化维护对象关系映射
【发布时间】:2012-08-29 08:15:43
【问题描述】:

我正在尝试找出一种方法,使我的一些数据库对象可序列化到 XML 文件或从 XML 文件序列化。

我正在为我的对象使用实体框架数据模型,并使用 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。

【问题讨论】:

    标签: c# wcf entity-framework serialization orm


    【解决方案1】:

    不熟悉 EF 以及对象模型的工作原理,但对于大多数通过 WCF 成功序列化/反序列化的对象,您可以直接使用 DataContractSerializer。有关简单的演练,请参阅this article

    由于您不需要 XML 可互操作,因此您也可以使用 preserveObjectReferences 设置来避免冗余数据。

    【讨论】:

    • 看起来很有希望,尽管它看起来非常冗长,并且它序列化了有关我的 EntityFramework 模型容器的信息。
    【解决方案2】:

    我强烈推荐 Json.NET 序列化器 http://json.codeplex.com/ 而不是 DataContractSerializer,因为后者有点错误。例如,您还可以查看这个问题,以了解更多关于为什么Json.Net 序列化程序更好的研究。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2019-06-01
      • 2013-05-27
      • 1970-01-01
      相关资源
      最近更新 更多