2

私はシリアライゼーションの基本にしか精通していませんが、今ではそれを使用しています。ReportBase 抽象クラスと、基本クラスから派生した複数のレポートを備えた既存のレポート システムがあります。これらにはそれぞれ、コンストラクターで指定された異なるレポート パラメーターと、場合によっては追加のメソッドがあります。派生クラスのいずれかをシリアル化し、後で派生クラスの型を知らなくても逆シリアル化することは可能ですか?

あるいは、それを達成するためにリフレクションで何かをすることもできます。おそらくシリアル化されたオブジェクトをデータベースに保存するので、レポートクラスを別のフィールドに追加できると思います。

4

1 に答える 1

4

はい、オブジェクトの実際のタイプを知らなくてもデシリアライズすることは確かに可能です。実際、逆シリアル化するために型について何も知る必要はありません。バイナリの意味での逆シリアル化は、バイトの配列を元の型に変換し、参照をオブジェクトとして返すだけです。後で、これをインスタンスの任意の正当なタイプに自由にキャストできます。

たとえば、次のコードはストリームをオブジェクトに逆シリアル化し、参照をReportBaseタイプに変換します。

public static void Deserialize(Stream stream)
{
    BinaryFormatter formatter = new BinaryFormatter();
    object obj = formatter.Deserialize(stream);
    ReportBase report= (ReportBase) obj;
}

私がそれが可能であると言ったことに注意してください。これが機能するためには、ストリームがReportBase派生クラスの有効なシリアル化されたインスタンスを指している必要があり、そのクラスはシリアル化のルールに準拠している必要があります。

意図されているがシリアル化できないクラスを作成するのは非常に簡単です:http://blogs.msdn.com/jaredpar/archive/2009/03/31/is-it-serializable.aspx

于 2009-04-03T03:02:31.293 に答える