2009-04-21 15 views
2

オブジェクトのシリアル化はどのように機能しますか?どのようにオブジェクトがデシリアライズされ、インスタンスはコンストラクタを呼び出さずにシリアル化された日付から作成されますか?オブジェクトのシリアル化

+0

http://forum.codecall.net/csharp-tutorials/7918-tutorial-visual-studio-2008-c-serialization.html –

+0

これがあなたの答えではないかどうかを教えてください。 –

答えて

6

私は言語が与えられていないので、この回答は無関係です。

オブジェクトをシリアライズすると、オブジェクトを再構築するためのすべての必須情報が取得可能な方法でエンコードされます。これには通常、オブジェクトのタイプとすべてのインスタンス変数の値が含まれます。

オブジェクトを直列化解除すると、正しいサイズのメモリ内の領域が割り当てられ、新しいオブジェクトが直列化されたものと同じになるように、直列化された情報を使用して設定されます。

実行中のプログラムは、実際にコンストラクタを呼び出すことなくメモリ内のこの新しいオブジェクトを参照できます。

これは説明していない詳細はほとんどありませんが、これはシリアル化/デシリアライゼーションの一般的な考え方です。

+0

+1はいこれは彼の質問が指していることです。 – TStamper

0

Javaについて話していますか?そうであれば、シリアライゼーションは奇妙なオブジェクト作成メカニズムです。バックドアはネイティブコードを使用して、コンストラクタを呼び出さずにオブジェクトを作成します。したがって、直列化可能なクラスを設計するときは、デシリアライズによって作成されたクラスが、コンストラクタのパスと同じ不変条件(キーフィールドが初期化されている)を維持することを確認する必要があります。 Javaでオブジェクトを作成する第3の方法は、クローニングによるものであり、同様の問題が適用されます。

クローンとシリアル化は、フィールドの値をクローンまたはデシリアライゼーションプロセスによって返される値と異なる値に設定する必要がある場合は、最終フィールドの使用とうまく対話しません。

Josh Blochの「Effective Java」には、これらの問題をより深く説明する章があります。 .NETについて

(この答えはあまりにも他の言語に適用される場合がありますが、私は唯一のJavaで直列化を使用しました)

0

:これは決定的か教科書答えではない、と私はすべてのアウト間違っている可能性があります...

.NETのシリアライズは、バイナリと他のもの(XMLまたはXMLの一般的な導関数)に分離する必要があります。バイナリのシリアライゼーションは主に私にとってはブラックボックスですが、オブジェクトを現在の状態でシリアライズして復元することができます。 XML直列化は、通常、カスタムISerializable実装を追加することによってオーバーライドされない限り、オブジェクトのパブリックフィールド/プロパティを直列化するだけです。

XMLのシリアル化の場合、.NETはReflectionを使用して、どのフィールドとプロパティが同等の要素に変換されるかを判断します。 [XMLSerializable]属性を追加すると、フィールドレベルで他の属性([XMLAttribute]など)を適用することで調整できるデフォルトの動作が実装されます。

メタデータ(Reflectionが依存する)は、すべてのオブジェクトメンバーとその属性とアドレスを格納します。これにより、シリアライザは出力の構築方法を決定できます。

関連する問題