尽管转换,反序列化不正确的类

时间:2012-06-27 13:31:20

标签: c# deserialization

在反序列化在MySQL数据库中存储为BLOB的多个对象时遇到问题。

每个对象类都有自己的反序列化函数。

Class1 c1Holder = (Class1)binFormatter.Deserialize(memStream);

工作正常,但随后......

Class2 c2Holder = (Class2)binFormatter.Deserialize(memStream);

...调用Class1反序列化函数。当我使用VS 2010调试器逐步执行它时,它将在第二次尝试时调用正确的函数。 也...

Class3 c3Holder = (Class3)binFormatter.Deserialize(memStream);

...调用Class1反序列化函数,然后调用Class2函数,最后调用正确的函数。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

来自评论:

  

无法将'Assembly.Class1'类型的对象转换为'Assembly.Class4'类型。

     

无法将'Assembly.Class2'类型的对象转换为'Assembly.Class4'类型。

     

无法将'Assembly.Class3'类型的对象转换为'Assembly.Class4'类型。

这表明您只是期望数据与实际不同。 BinaryFormatter的观点是,如果序列化Class7,那么它将反序列化为class7。对于其他序列化程序,您经常需要告诉它将其反序列化为什么,允许不同类型可以互换,只要它们看起来相似。

所以使用BinaryFormatter:如果你想得到一个Class2,序列化一个Class2。

要明确,以下内容:

Class2 c2Holder = (Class2)binFormatter.Deserialize(memStream);

说“将其反序列化为Class2” - 它更像是:

object tmp = binFormatter.Deserialize(memStream);
Class2 c2Holder = (Class2)tmp;

即。 “将其序列化为任何形式,然后将其转换为Class2”。如果不是 Class2,它将失败。这不是转换等 - 只是一种类型检查。

如果您想要使用类似但不同类型的序列化建议,请告诉我。