C#:将序列化的对象保存到DB中的文本字段,以后如何维护对象格式版本
本文关键字:对象 何维护 维护 版本 格式 字段 保存 序列化 DB 文本 | 更新日期: 2023-09-27 18:36:24
我在 ASP.NET MVC C#应用程序中有复杂的对象(嵌套属性,集合等)。我不需要将其保存到数据库中的多个表中,序列化整个对象并像整体一样存储它是可以的。
我计划序列化整个对象(在人类可读的东西中,如 JSON/XML)并存储在数据库的文本字段中。
我稍后需要从数据库加载此对象并使用强类型视图呈现它。
问题来了:将来对象的类可以更改(我可以添加''删除字段等)。但是之前保存到数据库中的序列化版本不会反映更改。
如何处理这个问题?
每次显著更改结构化序列化消息时,都应编写某种转换实用程序,并将其作为升级过程的一部分运行。添加或删除可为空的字段不太可能成为问题,但更大的结构更改将是问题。
你可以做一些事情,比如实现IXmlSerializable,查看消息并找出消息的版本并适当地转换它,但是如果你必须做很多事情并且你的应用程序有一个很长的生命周期,这将很快变得一团糟。因此,您最好在升级过程中预先执行此操作,并在应用程序之外执行此操作。
如果您担心在升级过程中对大量记录运行转换,则可以想出一些方法来提高效率(例如,向包含消息架构版本的表添加一列,以便您可以有效地定位过期的消息)。
只要您使用 JSON 或 XML,添加的字段就应该不是问题(只要没有强制实施特定版本的架构),例如,默认的 .net XML 序列化程序不包括具有默认值的字段(可以使用 System.Component.DefaultValue 属性进行设置)。因此,在反序列化时,新字段将被视为与省略的字段相同,并获取其默认值(默认类值,即 DefaultValue 属性仅适用于序列化/设计器行为)。删除的字段取决于您的反序列化实现,但可以进行删除,以便忽略这些字段。就我个人而言,我倾向于保留这些属性,但将它们标记为过时,并附上它们曾经的用途。这样,在编码时,您就会知道不要使用它们,但仍然可以填充以向后兼容(并且在标记为过时时不应序列化它们)。如果可能,您可以在填充更新的数据结构的过时属性中实现逻辑。