17

ドキュメントをバイト配列に変換してディスクに保存し、ファイルを元の形式に再構築できることを確認します(ファイル名などのメタデータがある限り)。

[Serializable]クラスをetcでマークする必要があるのはなぜですか? 「メタデータ」タイプの情報と同じ考え方なので、オブジェクトをそのクラスにキャストすると、適切にマップされますか?

4

6 に答える 6

27

バイナリ シリアライゼーションは非常に強力です。コンストラクタを実行せずにクラスのインスタンスを作成し、private と宣言したクラスにフィールドを設定できます。もちろん、通常のコードではこれを行うことはできません。[Serializable] 属性を適用することで、プライベートな部分をいじることを明示的に許可します。そして、BinaryFormatter クラスのみにそのアクセス許可を暗黙的に付与します。

XML シリアライゼーションでは、このような問題は必要ありません。公開されているメンバーのみをシリアライズします。

DataContractSerializer は、プライベート メンバーもシリアル化できます。したがって、[DataContract] 属性を使用して、明示的な OK が再度必要になります。

于 2010-04-07T19:14:07.827 に答える
18

まず、する必要はありませ

これは、クラスがシリアル化できるアイテムで構成されており (これは真である場合とそうでない場合があります)、デフォルトのシリアライゼーションを使用できることをシリアライザーに伝える単純なマーカー インターフェイスです。

には、クラスへのXMLSerializerゼロ パラメーター コンストラクターを持つという追加の要件があります。

シリアライゼーションにコントラクトを使用する他のシリアライザー ( などDataContractSerializer) があります。クラスを単にSerializable. インターフェイスを実装することで、より詳細に制御することもできISerializableます。

于 2010-04-07T19:01:02.363 に答える
2

すべてのプロパティまたはクラスをシリアル化する必要はないため、そのクラスをシリアル化する必要があることをシリアライザーに示します。

于 2010-04-07T18:59:17.767 に答える
2

これは基本的に、クラスをシリアル化できることを示すメタデータであり、それ以上のものではありません。

これは、この属性が適用されていない型の処理を拒否する多くのフレームワーク シリアライザーで必要とされます。

于 2010-04-07T19:11:09.750 に答える
2

シリアル化はセキュリティ ホールを作成する可能性があり、バージョン管理の問題に悩まされる可能性があります。その上、一部のクラスでは、シリアライゼーションのアイデア自体がまったくナンセンスです。

詳細については、Why Java needs Serializable interface?への優れた回答を参照してください。、特にこれこれこれ。彼らは、シリアル化は明示的にオプトインする必要がある機能であるべきだと主張しています。

反対に、その質問に対する受け入れられた答えは、クラスがデフォルトでシリアライズ可能であるべきであることを示しています。

于 2010-04-07T19:11:56.990 に答える
0

クラスをシリアル化できるようにすることを思い出させるものだと思います。したがって、すべきではないものを暗黙的にシリアル化することはありません。

それがデザイナーの意図であることを知りません。

ところで、私はできる限りそれを愛しBinaryFormatter、使用しています。ほとんどの処理が自動的に処理されます (グラフ全体に繰り返し参照が広がる複雑なオブジェクト グラフの再構築など)。

于 2010-11-27T18:08:51.540 に答える