2

どのような状況で、どのような理由で、serializationプロセスのカスタマイズを検討する必要がありますか? (次のメソッドは、によって呼び出されるメソッドですJVM)

 private void writeObject(java.io.ObjectOutputStream out){
         //customize serialization
 }
 private void readObject(java.io.ObjectInputStream in){
         //customize de-serialization
 } 
4

6 に答える 6

2

SUNから高度なシリアル化を読む

  1. オーバーライドする一般的な理由の1つは、それ自体readObjectwriteObjectはないスーパークラスのデータをシリアル化することです。Serializable
  2. ストリームを検証する
  3. シリアル化されたオブジェクトを暗号化する
于 2012-06-19T17:41:17.373 に答える
2

シリアル化を制御したい場合があると思います。

  • シリアル化されたデータを暗号化して後で復号化する場合。
  • また、ユーザーや他のアプリにオブジェクトのシリアル化された形式を変更してもらいたい場合もあります。その場合は、より人間に優しいものを作成することをお勧めします。
  • ネットワークを介してデータを送信している場合は、反対側のプログラムがデータを理解できるようにデータを適合させることができます。

それが私が今考えることができる理由です。

それが役に立てば幸い。

于 2012-06-19T17:41:22.600 に答える
1

カスタマイズされたシリアライゼーションの利点の 1 つは、一時的なフィールド (他のクラスから継承されたものなど) をシリアライゼーション プロセスに追加できることです。あなたはこのようにすることができます

class NotMyClass implements Serializable {
    String login;
    transient String password;
    //...    
}

//I want to serialize also transient password field
class MyClass extends NotMyClass {

    private void writeObject(ObjectOutputStream out) throws IOException {
        System.out.println("defaul serialization");
        out.defaultWriteObject();

        System.out.println("my serialization >>>> adding inherited transient value");
        out.writeObject(password);
    }

    private void readObject(ObjectInputStream in) throws IOException,
            ClassNotFoundException {
        System.out.println("defaul deserialization");
        in.defaultReadObject();
        System.out.println("my deserialization <<<< reading stored transient value");
        password = (String) in.readObject();
    }
}
于 2012-06-19T18:38:08.130 に答える
0

もう1つの大きな理由は、シリアル化されるデータの量を減らしたい場合です。たとえば、HashMap容量が1024のaを考えてみましょう。これまでのところ、エントリが3つしかないとします。1024のObject配列をシリアル化することは、3つのエントリをシリアル化するだけでよい場合、非常に無駄になります。

別の注意点として、シリアル化するオブジェクトにシリアル化できないサービスへの参照がある場合は、最初にそれらのメンバーを一時的なものとしてマークし(シリアル化を防ぐため)、次にを使用しwriteObjectて十分な情報をキャプチャreadObjectし、参照を再確立できるようにします。逆シリアル化。

于 2012-06-19T18:08:22.230 に答える
0

私が考えることができる唯一の理由はserialization、スーパークラスが既にserializable.

他に具体的な理由があるかどうかはわかりません。

于 2012-06-19T17:34:17.160 に答える
0

読み取りまたは書き込み時に行うことをカスタマイズしたい場合があります。ログを追加したり、計算を実行したり、特定の条件が満たされた場合にのみ読み取りまたは書き込みを行うことができます。 Java が許可することは何でもできます。例については、 http://java.sun.com/developer/technicalArticles/Programming/serialization/の「デフォルト プロトコルのカスタマイズ」セクションを参照してください。

于 2012-06-19T17:40:39.387 に答える