0

我的 ASP.NET MVC C# 应用程序中有复杂的对象(嵌套属性、集合等)。我不需要将它保存到数据库中的多个表中,序列化整个对象并将其存储为一个整体就可以了。

我计划序列化整个对象(以人类可读的方式,如 JSON/XML)并存储在数据库的文本字段中。

我需要稍后从数据库加载这个对象并使用强类型视图呈现它。

问题来了:将来对象的类可以改变(我可以添加\删除字段等)。但是之前保存到数据库中的序列化版本不会反映变化。

如何处理?

4

2 回答 2

2

只要您使用 JSON 或 XML,添加的字段应该不是问题(只要没有强制执行特定的版本模式),例如,默认的 .net XML 序列化程序不包括具有默认值的字段(可以使用 System.Component.DefaultValue 属性设置)。因此,新字段在反序列化时将被视为与省略的字段相同,并获取它们的默认值(默认类值,即 DefaultValue 属性仅适用于序列化/设计器行为)。删除的字段取决于您的反序列化实现,但可以使这些字段被忽略。就个人而言,我倾向于保留这些属性,但将它们标记为已过时,并带有它们曾经的用途的信息。这样在编码时你会知道不要使用它们,但仍然可以填充以实现向后兼容性(并且在标记为过时时不应对其进行序列化)。如果可能,您可以在填充更新数据结构的过时属性中实现逻辑。

于 2012-06-07T08:26:40.013 回答
2

每次显着更改结构化的序列化消息时,都应该编写某种转换实用程序,并将其作为升级过程的一部分运行。添加或删除可为空的字段不太可能成为问题,但更大的结构更改将成为问题。

您可以执行诸如实现 IXmlSerializable 之类的操作,查看消息并找出消息的版本并进行适当的转换,但是如果您必须经常这样做并且您的应用程序的生命周期很长,那么这将很快变得一团糟。因此,您最好在升级过程中以及在您的应用程序之外预先进行操作。

如果您担心在升级过程中对大量记录运行转换,您可以想出一些方法来提高效率(例如,在包含消息模式版本的表中添加一列,这样您就可以有效地定位过时的消息)。

于 2012-06-07T08:30:32.047 回答