2009-08-25 12 views
0

現在、ユーザーのセッションオブジェクトをデータベースにシリアル化していますが、オブジェクトが最近変更されすぎてこのプロセスを再設計することにしました。オブジェクト全体をシリアライズすることはできず、フィールドごとに保存する必要があることに私たちは皆同意します。Javaシリアル化:readFields/putFieldsとシリアル化されたマップの比較

  1. マップにすべてのフィールドを格納し、マップをシリアル化します。
  2. ObjectOutputStream.putFields()を使用してください。

これら2つのアプローチの間に大きな違いはありません。 #1は使い慣れたマップインターフェイスを使用しているため、誰でも簡単に使用できます。 #2は、fields.get("confirmed", false)などの便利な方法を提供します。

#1と一緒に行く傾向があります。誰も#2の他の利点を知っていますか?

答えて

1

readFieldsおよびputFieldsは、デフォルトのシリアル化を使用して開始でき、必要なときに定型文を追加できるという利点があります。

Mapは、一度使用すると小さいストリームを生成しますが、これらのオブジェクトを多く格納するストリームはreadFields/putFieldsを使用すると小さくなります。これは、ストリームのフォーマットを記述する1回のオーバーヘッドがあるためです。

あなたは常にwriteObjectの開始時にreadObjectdefaultWriteObject/putFieldsの開始時にdefaultReadObject/readFieldsを呼び出す必要があります。残念ながら、これはチェックされていません。

0

thisサイトによれば、クラスにwriteObject(ObjectOutputStream)とreadObject(ObjectInputStream)という2つのプライベートメソッドを実装することで、値の読み書き方法をカスタマイズできます。上記のサイトの「デフォルトプロトコルをカスタマイズする」セッションを確認してください。これはおそらく推奨される方法であり、正しく覚えていれば、Effective Javaの本で説明されている推奨方法でもあります。

このようにすれば、フィールドが含まれているクラスでどのフィールドを読み書きするべきかのロジックが維持されます。これはカプセル化が優れています。

関連する問題