【问题标题】:serializing type definitions?序列化类型定义?
【发布时间】:2010-04-29 00:09:56
【问题描述】:

我不确定我会以正确的方式解决这个问题。我有一套具有不同类型输出(自定义类型)的应用程序。

例如,我可能有一个名为 Widget 的类型:

Class Widget
      Public name as String
End Class

在整个操作过程中,当用户遇到某种情况时,应用程序将获取用户接收到的小部件的输出实例,将其序列化,并将其记录到数据库中并注明类型的名称。

现在,我有其他应用程序做类似的事情,但不是处理小部件,它可能是具有不同属性的一些完全随机的其他类型,但我再次序列化实例,将其记录到数据库,并记下名称的类型。我可能有六种不同的类型,并且预计未来不会有太多其他类型。

说完这一切之后,我有了一个管理界面,可以查看这些日志,并且可以让用户查看已记录的这些数据的内容。 Admin 应用程序引用了所有涉及的类型,并且一些基本的 switch case 逻辑取决于类型的名称,将其转换为原始类型,并将其传递给一些具有基本显示逻辑的处理程序以吐出以可读格式返回数据(每种类型一个显示处理程序)

现在...这一切都很好...

直到有一天,我的模型发生了变化。 Widget 类现在已弃用 name 属性并添加了许多其他属性。当我尝试重构这些数据时,我当然会在管理端得到类型不匹配。

我想知道是否有某种方式,在运行时,我或许可以通过我的代码进行反映,并在那个精确的时刻获取类型定义的快照,将其序列化,并将其与数据一起存储,以便我可以以某种方式将来用它来重建它?

【问题讨论】:

    标签: vb.net serialization type-conversion


    【解决方案1】:

    我不需要这样做,因为在 MFC 时代,这是一个相当手动的过程,所以在 .Net 中的工作方式会有所不同,但无论如何这可能会有用。我们当时解决它的方法是,当我们序列化任何东西时,我们也写了一个版本号,我们只添加了要写入的新数据位,我们从未删除或修改任何东西(尽管我们会输出空数据,所以如果例如名称被删除了,我们会把它写成一个空字符串)。

    然后反序列化器将使用大量 if 语句,如果它超过版本 X,它只会读取某些部分数据,并且当它读取反序列化器中提到的所有内容时,它会忽略之后的任何内容。

    这样做的最大优势是数据可以被旧版本和新版本的应用程序读取,但显然它只有在应用程序可以为任何丢失的数据使用一些合适的默认值时才有效,但这应该如果您只想查看管理工具中的数据,这真的不是问题,并且会给您带来每次更改模型时更新管理工具不那么紧迫的优势。

    【讨论】:

      猜你喜欢
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      相关资源
      最近更新 更多