1

在反序列化存储为 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 函数,最后是正确的函数。

有任何想法吗?

4

1 回答 1

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,它将失败。这不是转换等 - 只是类型检查。

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

于 2012-06-27T15:18:19.407 回答