【问题标题】:Entities used to serialize data have changed. How can the serialized data be upgraded for the new entities?用于序列化数据的实体已更改。如何为新实体升级序列化数据?
【发布时间】:2011-01-14 19:00:54
【问题描述】:

我有一堆简单的实体实例,我已经序列化到一个文件中。将来,我知道这些实体的结构(即,也许我会将Name 重命名为Header 什么的)。问题是,我不想丢失保存在所有这些旧文件中的数据。正确的方法是什么

  1. 将旧实体中的数据加载到新实体中
  2. 升级旧文件,以便它们可以用于新实体

注意:我认为我坚持使用二进制序列化,而不是 xml 序列化。

提前致谢!

编辑:所以我对我所描述的案例有一个答案。我可以使用 dataContractSerializer 并执行类似的操作

[DataMember("bar")]
private string foo;

并更改代码中的名称并保留用于序列化的相同名称。但是以下其他情况呢:

  1. 原实体有新成员可以序列化
  2. 删除了原始实体中的一些序列化成员
  3. 一些成员实际上在功能上发生了变化(假设原始类有一个 FirstName 和 LastName 成员,并且它已经被重构为只有一个 FullName 成员,它结合了两者)

为了处理这些,我需要某种解释器/翻译器反序列化类,但我不知道应该使用什么

【问题讨论】:

    标签: c# serialization refactoring model domain-driven-design


    【解决方案1】:

    我你用过BinaryFormatter,那么注意这是一个field序列化器,不是属性序列化器;您可以通过不更改字段名称来解决它。除非它是一个自动实现的属性,在这种情况下你不能。

    说实话,如果您想要灵活地改变类型,BinaryFormatter 是一个糟糕的选择。基于契约的序列化器在这里更加灵活。例如,XmlSerializer 和 DataContractSerializer 允许您通过属性控制名称。

    如果你想要二进制文件,我会使用 protobuf-net(也许是因为我写了它......) - 这里 没有 没有名称 - 只是数字标识符。但是 protobuf 格式是由 Google 专门设计的,以允许轻松升级 API。

    当然,您也可以将 DTO 视为永久合同;在这种情况下,请考虑使用 v1 DTO、v2 DTO 等。不是我自己倾向于这样做的方式,但绝对是一种选择。

    【讨论】:

    • 我不能使用标准的 XmlSerialization,因为我必须序列化私有成员。我还没有听说过 DataContractSerializer,所以我会检查一下,然后回复给大家。
    • @i8abug DCS 确实可以序列化私有成员 - 只需将 [DataMember] 添加到私有字段/属性 - 工作完成。
    • +1 为您提供建议。我发现这篇文章 eggheadcafe.com/software/aspnet/33261910/... 它给出了以下 [DataMember("bar")] 私有字符串 foo;但我必须编辑我的问题,因为我还想解决我添加要序列化的新字段、删除以前序列化的字段或完全修改某些内容的序列化方式的情况(即,将 FirstName 和 LastName 组合成一个新的 FullName属性)
    【解决方案2】:

    无论您使用何种序列化机制,重命名属性都是一项重大更改。二进制序列化的问题是您无法轻松地将文件升级到新格式,而使用文本格式序列化将是一项更容易的任务。

    【讨论】:

    • 不,不是;许多序列化程序允许您将其抽象出来; XmlSerializer、DataConteactSerializer、protobuf-net 在这里都很好
    • @Marc,是的,你是对的,他们在实体和需要更新的序列化格式之间使用了中间映射。
    【解决方案3】:

    你需要编写一个程序

    • 将数据反序列化为旧版本的实体
    • 将旧版本的实体转换为新版本的实体
    • 将实体的新版本序列化回文件。

    如果您已将其序列化为 XML,您可能会编写一个 XSLT 来直接进行所需的更改。

    【讨论】:

    • 这行得通,但是你必须保留所有这些旧版本的实体。我认为必须有某种方法可以映射到新的属性名称。
    猜你喜欢
    • 2019-05-25
    • 2019-04-10
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2023-03-30
    相关资源
    最近更新 更多