我不是肯定的我正是以正确的方式来做这件事。我有一套具有不同类型输出的应用程序(自定义类型)。
例如,我可能有一个名为Widget的类型:
Class Widget
Public name as String
End Class
在整个操作过程中,当用户遇到某种情况时,应用程序将获取用户收到的小部件的输出实例,将其序列化,并将其记录到数据库中,并注明该类型的名称。
现在,我有其他类似的应用程序,但它不是处理Widget,它可能是一些完全随机的其他类型具有不同的属性,但我再次序列化实例,将其记录到数据库,并记下名称这种类型。我可能有六种不同的类型,并且预计未来会有太多额外的类型。
完成所有这些后,我有一个查看这些日志的管理界面,并且用户可以查看已记录的此数据的内容。 Admin应用程序引用了所涉及的所有类型,并且一些基本的开关案例逻辑取决于类型的名称,将其转换为原始类型,并将其传递给具有基本显示逻辑的一些处理程序以吐出数据以可读格式退出(每种类型的一个显示处理程序)
现在......这一切都很好......
直到有一天,我的模特改变了。 Widget类现在已弃用name属性并添加了许多其他属性。当我尝试重新构建这些数据时,我当然会在管理端遇到类型不匹配。
我想知道是否有某种方式,在运行时,我可以通过我的代码反映并在该精确时刻获取类型定义的快照,序列化它,并将其与数据一起存储,以便我可以以某种方式用这个来重组它吗?
答案 0 :(得分:1)
我不需要这样做,因为在MFC时代,这是一个非常简单的手动过程,所以在.Net中的工作方式不同,但也许这可能是有用的。我们解决它的方式是,当我们序列化任何东西时,我们也写了一个版本号,我们只添加了新的数据写入,我们从未删除或修改任何东西(虽然我们输出空数据,所以如果例如名称被删除了,我们把它写成空字符串。)
然后解串器会使用很多if语句,如果它只是在版本X上读取它的某些部分,并且当它读取了解串器中提到的所有内容时,它会在之后忽略任何内容。
这样做的最大好处是数据可以被应用程序的较旧版本和较新版本读取,但显然只有当应用程序可以使用某些合适的默认值来处理任何丢失的数据时才能读取数据,但这不应该如果你想要做的只是查看管理工具中的数据,那么这真的会成为一个问题,并且会给你带来的好处是,每当你对模型进行更改时,更新管理工具就不那么紧迫了。