2011-12-13 18 views
2

架空のシナリオSerializableを実装するタイプMessageのオブジェクトの出力ストリーム。 Messageには会員番号HeaderBodyがあります。 Headerは小さく、Bodyは大きくすることができます。 Headerの情報に基づいてフィルタを作成したいとします。Bodyを逆シリアル化せずに行う方法はありますか?Javaのオブジェクトの一部を逆シリアル化する方法はありますか?

+1

別々にシリアライズし、2つのオブジェクトを保存して最初のものだけを読み込みますか? –

+0

'Message'を分割できないとしましょう。 – user443854

答えて

1

独自のreadObject()を記述して、必要なフィールドだけを読み込むことができます。 ヘッダーだけを読みたい場合は、ヘッダーを最初にシリアル化してから本体をシリアル化するように注意する必要があります。次に、カスタムreadObject()メソッドで、最初の要素だけを読み込むように選択できます。

public class Message implements Serializable { 

    private transient String header; 
    private transient String body; 

    ... 
    // custom write object that writes header first and then body 
    private void writeObject(java.io.ObjectOutputStream oos) 
     throws IOException { 
    oos.defaultWriteObject(); 
    // explicitly store the transient fields 
    oos.writeObject(header); 
    oos.writeObject(body); 
    } 

    private void readObject(java.io.ObjectInputStream ois) 
     throws IOException, ClassNotFoundException { 
    ois.defaultReadObject(); 
    // explicitly read in the transient fields 
    header = (String) ois.readObject(); 
    if (needBody()) { // use some static/thread local variable to set this condition 
     body = (String) ois.readObject(); 
    } 
    } 
} 
+0

ありがとうございます、これは有望です。ヘッダに基づいて 'needBody()'スイッチを設定するには? 'header =(String)ois.readObject();' 'setNeedBody(StaticFilter.isGoodHeader(header))'と言うことができますが、コンシューマー固有のフィルタが異なるとどうなりますか?編集:私はThreadLocalフィルタを取得する静的メソッドを呼び出すことができると思います。私はこれを試してみましょう。再度、お返事いただきありがとうございます! – user443854

+0

@ user443854真/偽でのThreadLocal変数ルックアップは、そのトリックを行うべきです – shams

3

Bodyは、最初にtransientと宣言して、シリアル化してはいけません。

Messageオブジェクトを既にシリアル化している場合、特定のメンバーを選択的に非直列化する方法はありません。

+0

この作成された例では、理由のためにメッセージ本文があります。これは、ヘッダーを渡したフィルターを消費者に役立つ情報を提供します。 – user443854

+0

@ user443854:その場合、私の2番目のポイントを参照してください。選択的に非直列化することはできません。 – bragboy

+0

'readObject'をオーバーライドすることさえありませんか? – user443854

2

データベースと比較して、オブジェクト指向プログラミングの弱点の1つを発見しただけです。

私は、MessageクラスをMessageHeaderのようなものに分割する必要があります。ヘッダ情報と本文への参照はなく、本文と見た目に使用できるキーを持つMessageBodyクラスですヘッダデータをアップする。次に、シリアル化されたMessageHeaderオブジェクトとMessageBodyオブジェクトを別々に格納して取得する必要があります。

+2

"オブジェクト指向プログラミングは、データベースに比べて"?それはリンゴやオレンジのようなものではありません。 – jtahlborn

+0

さて、オブジェクト指向プログラミングの弱点ではありません... OOは、一緒に属していないオブジェクトに物を入れてはいけないと言います。とにかく、あなたのソリューションはスポットライトです。 – sleske

関連する問題