class/object 必须更改多少才能使二进制反序列化失败
How much does a class/object have to change in order for binary-deserialization to fail
我们有一个解决方案,我们将相当 large/complex C# 对象作为二进制数据存储在我们的数据库中。我担心的是,当对此 class 进行更改时,我们 运行 存在代码更改后保存到数据库的数据在反序列化时失败的风险。
这是我们用来序列化对象的代码:
public static byte[] SerializeObject(object toBeSerialized)
{
var stream = new MemoryStream();
var serializer = new BinaryFormatter();
serializer.Serialize(stream, toBeSerialized);
stream.Position = 0;
return stream.ToArray();
}
这是我们的反序列化方法:
public static T DeserializeObject<T>(byte[] toBeDeserialized)
{
using (var input = new MemoryStream(toBeDeserialized))
{
var formatter = new BinaryFormatter();
input.Seek(0, SeekOrigin.Begin);
return (T) formatter.Deserialize(input);
}
}
我的问题是,为了使旧对象的反序列化失败,必须 change/how 改变什么?
对 class 的数据结构(属性和字段)的任何更改都会导致您在尝试反序列化数据时遇到问题。
我确信更改方法的定义不会给您带来任何问题,添加或删除方法同样没问题。
编辑:我在我开发的类似系统上做了一些测试,我发现您可以添加新的属性和字段,并且仍然反序列化旧对象。在我看来,您遇到的唯一问题是删除、重命名或更改现有字段和属性的类型。
Related Question
始终保持序列化版本容差,在 this 文章中您可以找到一些如何做到这一点的建议
您还可以找到一些情况,打破 serialization/deserialization 下面
删除序列化字段时
当您将 NonSerializedAttribute 属性应用于某个字段时,如果该属性未应用于先前版本中的字段。
当您更改序列化字段的名称或类型时。
添加新的序列化字段时,没有 OptionalFieldAttribute 属性。
在没有 OptionalFieldAttribute 属性的情况下从字段中删除 NonSerializedAttribute 属性(在以前的版本中不可序列化)时。
我们有一个解决方案,我们将相当 large/complex C# 对象作为二进制数据存储在我们的数据库中。我担心的是,当对此 class 进行更改时,我们 运行 存在代码更改后保存到数据库的数据在反序列化时失败的风险。
这是我们用来序列化对象的代码:
public static byte[] SerializeObject(object toBeSerialized)
{
var stream = new MemoryStream();
var serializer = new BinaryFormatter();
serializer.Serialize(stream, toBeSerialized);
stream.Position = 0;
return stream.ToArray();
}
这是我们的反序列化方法:
public static T DeserializeObject<T>(byte[] toBeDeserialized)
{
using (var input = new MemoryStream(toBeDeserialized))
{
var formatter = new BinaryFormatter();
input.Seek(0, SeekOrigin.Begin);
return (T) formatter.Deserialize(input);
}
}
我的问题是,为了使旧对象的反序列化失败,必须 change/how 改变什么?
对 class 的数据结构(属性和字段)的任何更改都会导致您在尝试反序列化数据时遇到问题。
我确信更改方法的定义不会给您带来任何问题,添加或删除方法同样没问题。
编辑:我在我开发的类似系统上做了一些测试,我发现您可以添加新的属性和字段,并且仍然反序列化旧对象。在我看来,您遇到的唯一问题是删除、重命名或更改现有字段和属性的类型。
Related Question
始终保持序列化版本容差,在 this 文章中您可以找到一些如何做到这一点的建议
您还可以找到一些情况,打破 serialization/deserialization 下面
删除序列化字段时
当您将 NonSerializedAttribute 属性应用于某个字段时,如果该属性未应用于先前版本中的字段。
当您更改序列化字段的名称或类型时。
添加新的序列化字段时,没有 OptionalFieldAttribute 属性。
在没有 OptionalFieldAttribute 属性的情况下从字段中删除 NonSerializedAttribute 属性(在以前的版本中不可序列化)时。