1

MySQL データベースに BLOB として保存されている多数のオブジェクトをデシリアライズする際に問題が発生しました。

各オブジェクト クラスには、独自の逆シリアル化関数があります。

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

正常に動作しますが、その後...

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

...Class1 デシリアライズ関数を呼び出します。VS 2010 デバッガーを使用してステップ実行すると、2 回目の試行で正しい関数が呼び出されます。また...

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 に答える