架空のシナリオSerializable
を実装するタイプMessage
のオブジェクトの出力ストリーム。 Message
には会員番号Header
とBody
があります。 Header
は小さく、Body
は大きくすることができます。 Header
の情報に基づいてフィルタを作成したいとします。Body
を逆シリアル化せずに行う方法はありますか?Javaのオブジェクトの一部を逆シリアル化する方法はありますか?
答えて
独自の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();
}
}
}
ありがとうございます、これは有望です。ヘッダに基づいて 'needBody()'スイッチを設定するには? 'header =(String)ois.readObject();' 'setNeedBody(StaticFilter.isGoodHeader(header))'と言うことができますが、コンシューマー固有のフィルタが異なるとどうなりますか?編集:私はThreadLocalフィルタを取得する静的メソッドを呼び出すことができると思います。私はこれを試してみましょう。再度、お返事いただきありがとうございます! – user443854
@ user443854真/偽でのThreadLocal変数ルックアップは、そのトリックを行うべきです – shams
Bodyは、最初にtransient
と宣言して、シリアル化してはいけません。
Messageオブジェクトを既にシリアル化している場合、特定のメンバーを選択的に非直列化する方法はありません。
この作成された例では、理由のためにメッセージ本文があります。これは、ヘッダーを渡したフィルターを消費者に役立つ情報を提供します。 – user443854
@ user443854:その場合、私の2番目のポイントを参照してください。選択的に非直列化することはできません。 – bragboy
'readObject'をオーバーライドすることさえありませんか? – user443854
データベースと比較して、オブジェクト指向プログラミングの弱点の1つを発見しただけです。
私は、MessageクラスをMessageHeaderのようなものに分割する必要があります。ヘッダ情報と本文への参照はなく、本文と見た目に使用できるキーを持つMessageBodyクラスですヘッダデータをアップする。次に、シリアル化されたMessageHeaderオブジェクトとMessageBodyオブジェクトを別々に格納して取得する必要があります。
- 1. リストオブジェクトの代わりに単一のオブジェクトとしてリストを逆シリアル化する方法はありますか?
- 2. 正しいJson逆シリアル化をJavaオブジェクトにする方法は?
- 3. デバッグモードでオブジェクトをシリアル化する方法はありますか?
- 4. JSONオブジェクトを逆シリアル化する際に特定のプロパティを無視する方法はありますか?
- 5. JObjectから.NETへのオブジェクトを逆シリアル化する方法
- 6. Javaのファイルからオブジェクトを逆シリアル化する
- 7. MSMQ複合オブジェクトのシリアル化/逆シリアル化
- 8. xStreamの問題 - 複数のオブジェクトを逆シリアル化する方法
- 9. JSON文字列を.NETオブジェクトに逆シリアル化する方法は?
- 10. オブジェクトへのxml応答を逆シリアル化する方法
- 11. jsonオブジェクトを特定のサブクラスに逆シリアル化する方法
- 12. 逆シリアル化の逆シリアル化
- 13. XML XNAオブジェクトの逆シリアル化
- 14. Javaのクラスバイトコードにアクセスせずにオブジェクトを逆シリアル化する
- 15. 複数のJavaオブジェクトを逆シリアル化する
- 16. jacksonを使ってjsonリストをJavaオブジェクトに逆シリアル化する方法
- 17. JSONオブジェクトをC#で特定の深度にシリアル化または逆シリアル化する方法は?
- 18. CommandResultを逆シリアル化する方法
- 19. C#でオブジェクトをXMLに逆シリアル化する際のデータがありません
- 20. javaの逆シリアル化時にコンストラクタを呼び出さずに、直列化されたクラスのオブジェクトを動的に作成する方法はありますか?
- 21. オブジェクトは異なるフレームワークバージョン間でシリアル化/逆シリアル化できますか?
- 22. JSONをLINQオブジェクトに逆シリアル化する
- 23. JSONをオブジェクトに逆シリアル化する
- 24. RIAサービス:JSON逆シリアル化には制限がありますか?
- 25. 一般的な方法でSQLクエリの結果をシリアル化および逆シリアル化する方法
- 26. JSONからJavaオブジェクトへのエスケープされたプロパティの逆シリアル化
- 27. JSONをJava enumに逆シリアル化する
- 28. JsonObjectsから.NETオブジェクトへの逆シリアル化
- 29. C#でポインタを直列化および逆シリアル化する方法はありますか?
- 30. Linq to XML - オブジェクトに逆シリアル化する
別々にシリアライズし、2つのオブジェクトを保存して最初のものだけを読み込みますか? –
'Message'を分割できないとしましょう。 – user443854