Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:将序列化对象保存到数据库中的文本字段,将来如何维护对象格式版本?_C#_Asp.net Mvc_Asp.net Mvc 3_Serialization_Deserialization - Fatal编程技术网

C#:将序列化对象保存到数据库中的文本字段,将来如何维护对象格式版本?

C#:将序列化对象保存到数据库中的文本字段,将来如何维护对象格式版本?,c#,asp.net-mvc,asp.net-mvc-3,serialization,deserialization,C#,Asp.net Mvc,Asp.net Mvc 3,Serialization,Deserialization,我的ASP.NET MVC应用程序中有复杂的对象(嵌套属性、集合等)。我不需要将它保存到数据库中的多个表中,序列化整个对象并将其作为一个整体存储是可以的 我计划序列化整个对象(以JSON/XML等人类可读的格式),并将其存储在数据库的文本字段中 我需要稍后从DB加载这个对象,并使用强类型视图呈现它 问题来了:将来对象的类可以更改(我可以添加\删除字段等)。但之前保存到DB中的序列化版本不会反映更改 如何处理此问题?只要您使用JSON或XML,添加的字段就不会有问题(只要没有强制执行特定的版本架构

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

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

我需要稍后从DB加载这个对象,并使用强类型视图呈现它

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


如何处理此问题?

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

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

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

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


如果您担心在升级过程中对大量记录运行转换,您可以想出一些方法来提高转换效率(例如,向包含消息架构版本的表中添加一列,以便有效地将过期的消息作为目标).

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

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

如果您担心在升级过程中会对大量记录运行转换,您可以想出一些方法来提高转换效率(例如,在包含消息架构版本的表中添加一列,以便有效地将过期的消息作为目标)