2009-08-21 3 views
10

なぜオブジェクトのすべての型が暗黙的にシリアライズ可能ではないのですか?オブジェクトのすべての型が直列化可能ではないのはなぜですか?

私の限られた理解では、オブジェクトは単にヒープ上に格納されず、スタック上のポインタですか?

プログラムによってプログラムをトラバースすることはできません。ユニバーサル形式で保存し、そこから再構築できるはずですか?

+0

どのような言語、フレームワークですか? –

+1

私は一般的に質問していました。:-) – Matt

答えて

18

ファイルポインタやネットワークソケットなどのリソースをカプセル化するオブジェクトの中には、を含まないオブジェクトをシリアル化したときの状態にデシリアライズできないものがあります。

例:あなたがそうするため あなたは へのシリアライズ形式を必要とするだろう、認証された データベース接続として機能 オブジェクトをデシリアライズする平文パスワードを含めることはできません。 誰かが保存された シリアライズされたフォームを保持する可能性があるので、この は良い習慣ではありません。あなたは データベースサーバがまだ など、有効な 資格情報はまだ、認証をアクセスすることができ、実行されていることを逆シリアル化するときにも

3

いいえ、時にはあなたはすべての情報を持っていないので、何の アイデアを持っていませんあなたがそれらを再構築する場所で。あなたがそれを持っていたのと同じ文脈でオブジェクトを再構成していないかもしれないことを忘れないでください。それは異なる機械であっても、異なる言語であってもよい。

5

OSの状態が含まれていないオブジェクトだけを考慮しても、一見すると問題は難しくなります。グラフにはサイクルがある可能性があります。エンティティは、複数のトップレベルエンティティから参照されることがあります。

私はoutline a universal serialization library in c in a previous answerに行ってみましたが、いくつかのハードケースがあることがわかりました。

+0

右にはサイクルなどがありますが、これらは解決された問題です。これを、ウィンドウハンドルまたはファイルハンドルをシリアル化する無意味さと比較してください。 –

+0

@スティーブン・スディット:私はそれらを「解決する」よりも「解決可能であることがわかっている」と評価します。決定を下す必要があります:あなたが現在どれだけシリアライズしているかと、逆シリアル化された構造がどれほど後であるかのトレードオフ。異なる問題は、異なる選択肢を必要とするかもしれない。問題には解決策がありますが、すべてのケースで単一の解決策はありません。それが問題を難しくする理由です。 – dmckee

+0

問題は難しいですが、他の人がすでに私たちのために解決しています。例えば、.NETでは、サイクルを邪魔することなく完全に実行可能なシリアライゼーションシステムがあります。他のプラットフォームでも同様のソリューションがあります。しかし、それらのどれも、ハンドルのようなものを連載することはできません。これは深刻な問題です。 –

0

技術的には、メモリ空間内の任意のオブジェクトをシリアル化して、ハードドライブのような耐久性のある媒体に保存することができます。大部分のOSは、ディスクとの間でアクティブなメモリをページングし、多くの場合、ハイバネートスタイルの機能も備えています。問題はスコープの1つです。たとえば、メモリ空間に文字列オブジェクトを作成し、それに合わせてシリアル化してデシリアライズします。ファイルを開くと、OSはファイルハンドルを与えますが、OSは引き続きハンドルを持つ実際のファイルオブジェクトを含むファイルシステムを所有しています。一方、ファイルシステムドライバは、ファイルハンドルおよび他のファイル関連メタデータの永続データベースを維持しなければならない。

1

ネットワーク接続を含み、Webサーバーからデータをストリーミングするオブジェクトをシリアル化するにはどのくらいの意味がありますか?

デシリアライズするとどうなりますか?接続を再度開いたら、ファイルを再ダウンロードしますか?

1

あなたはあなたの前提の通りです。

あなたがオブジェクトの完全な解体と再構築を可能にする完全な情報を持っている)グループ

1にプログラム内のすべてのオブジェクトの集合を分割することが可能でなければなりません。数字や文字列の配列、構造体は良い例です。

2)建設に関する情報があります。外部コードを呼び出すことによってオブジェクトを再構築することができます。ファイルが良い例ですが、プログラムでは、構造と状態のパラメータを記憶しているファイル抽象化が必要です。たとえば、ファイルへのパスとファイル内の位置を保存できます。しかし、再構成が失敗する可能性があります。 (たとえば、ファイルが削除または変更されました)

3)構成情報がありません。オブジェクトは何らかの形でランダムに受信されました。

ここで、オブジェクトを完全にシリアル化できるようにするには、3)から2)から1)に進む必要があります。 3)のオブジェクトは、タイプ2)のオブジェクトの属性とすることができ、タイプ2)オブジェクトを正常に再構成することによって取り出すことができる。

しかし、型2)オブジェクトは、型と文字列、真のデータなど、タイプ1でなければならない構造情報だけを直列化して再構築する必要があります。

プログラム全体の状態を再構成したい場合は、タイプ2のオブジェクトをカプセル化する抽象化で作業する必要があるため、この全体のスキームは高価に見えます。また、オブジェクトを再構成できないときは、私たちが何をするかを知る必要があります。また、タイプ1のオブジェクトだけを収集すると予想されるタイプ3またはタイプ2のオブジェクトには、これらのタイプのオブジェクトを混在させないようにする必要があります。

関連する問題