2010-04-29 129 views
0

我不积极我正在以正确的方式进行。我有一套具有不同输出类型(自定义类型)的应用程序。序列化类型定义?

例如,可能我的Widget称为类型:

Class Widget 
     Public name as String 
End Class 

在整个操作过程中,当用户遇到一定的条件下,应用程序将利用该用户收到的widget的是输出实例,序列化它,并将其记录到数据库中,记录该类型的名称。

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

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

现在又回到了......这一切都很好...

直到有一天,我的模型改变。 Widget类现在已弃用了name属性,并添加了一大堆其他属性。当我尝试重新构建这些数据时,我当然会在管理员端获得类型不匹配。

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

回答

1

我不需要这样做,因为回到MFC的日子里,这是一个非常手动的过程,所以在.Net中工作方式不同,但也许这可能是有用的。我们解决这个问题的方式是,当我们序列化任何东西时,我们也写了一个版本号,并且我们只添加了新的数据位来写,我们从不删除或修改任何东西(尽管我们会输出空数据,所以如果名称被删除,我们将它写为一个空字符串)。

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

这样做的一大优点是数据可以被旧版本和新版本的应用程序读取,但显然只有当应用程序可以对缺失的数据使用某些合适的默认值时才能使用,但是如果您只想查看管理工具中的数据,就不应该成为问题,并且会给您带来的好处,即每次更改模型时都不需要更新管理工具。

相关问题