架空のシナリオ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. JSON逆シリアル化:内部に複数のオブジェクトがあります
- 2. リストオブジェクトの代わりに単一のオブジェクトとしてリストを逆シリアル化する方法はありますか?
- 3. Runnableを逆シリアル化する方法はありますか?
- 4. Javaでスカラー逆シリアル化されたオブジェクトを逆シリアル化する
- 5. 正しいJson逆シリアル化をJavaオブジェクトにする方法は?
- 6. 内部XMLをオブジェクトに逆シリアル化する方法
- 7. Java SimpleXMLでネストされたオブジェクトを逆シリアル化する方法
- 8. デバッグモードでオブジェクトをシリアル化する方法はありますか?
- 9. Javaで抽象クラスまたはインターフェイスのオブジェクトをシリアル化および逆シリアル化する方法は?
- 10. jsonからのオブジェクトのリストを逆シリアル化する方法
- 11. JSONはブラケット内の一連のオブジェクトを逆シリアル化します{
- 12. JSONオブジェクトを逆シリアル化する際に特定のプロパティを無視する方法はありますか?
- 13. JObjectから.NETへのオブジェクトを逆シリアル化する方法
- 14. WCFのSilverlightアプリケーションでオブジェクトをシリアル化/逆シリアル化する必要はありますか?
- 15. 単一または配列にできる要素を逆シリアル化する方法はありますか?
- 16. MVCアプリケーションのCookieからオブジェクトをシリアル化、逆シリアル化するC#
- 17. Javaのファイルからオブジェクトを逆シリアル化する
- 18. MSMQ複合オブジェクトのシリアル化/逆シリアル化
- 19. オブジェクトxmlのシリアル化/逆シリアル化
- 20. xStreamの問題 - 複数のオブジェクトを逆シリアル化する方法
- 21. cbor2でオブジェクトをシリアライズおよび逆シリアル化する方法は?
- 22. JSON文字列を.NETオブジェクトに逆シリアル化する方法は?
- 23. jsonオブジェクトを逆シリアル化する方法は?
- 24. xmlの一部のタグは逆シリアル化されません
- 25. GenericXmlSecurityTokenを格納/逆シリアル化/シリアル化する方法は?
- 26. Javaオブジェクトのシリアライゼーション:Hashtableをシリアライズし、HashMapで逆シリアル化します。
- 27. 動的(数値)キー名を使用して子オブジェクトを逆シリアル化する方法はありますか?
- 28. ArrayListのオブジェクトを逆シリアル化する方法
- 29. jsonオブジェクトを特定のサブクラスに逆シリアル化する方法
- 30. オブジェクトへのxml応答を逆シリアル化する方法
別々にシリアライズし、2つのオブジェクトを保存して最初のものだけを読み込みますか? –
'Message'を分割できないとしましょう。 – user443854