2017-12-28 43 views
-1

私は変更できないクラスのオブジェクトを持っています。循環依存関係を持つ既存のJavaオブジェクトをシリアライズ

オブジェクトには循環依存があります。

オブジェクトをシリアル化したいですが、ライブラリにあるように、Javaソースコードにアクセスできません。

C++では、サブクラスを作成して仮想メソッドをオーバーライドし、次にキャストして目的の動作を得ることができました。 Javaではこれは不可能です。

新しいPOJOクラスを作成し、すべてのフィールドを手作業でコピーする以外に、どのようなオプションがありますか?

+0

、ご質問に対する解決策は離れグーグルであることを意味します。 –

+0

いいえ、そうではありません... –

+0

リフレクションを使用して、すべてのフィールドを再帰的にコピーし、サイクルを解決するために「IdentityHashMap」を使用することができます。しかし、私は確信している、誰かがすでにそれをした:https://stackoverflow.com/a/5294224/581205 – maaartinus

答えて

0

Serializableを使用したシリアル化は、とにかくやや臭いです。 JSON(例:JacksonGSON)またはバイナリ形式(例:Kryo)のいずれかを使用して、外部シリアライザを使用することをおすすめします。いずれにしても、循環依存関係を解決するカスタムシリアライザをこれらのすべてで作成できます。

+0

どのようにクラスに注釈を付けることなく循環依存関係を解決しますか? –

+0

私がリストアップしたすべての技術は外部依存関係を解決する外部シリアライザをサポートしています。どのように行うかはあなた次第ですが、オブジェクトリストをオブジェクトIDのリストとしてシリアル化し、それらのオブジェクトをパーシスタンス層のIDでロードしてデシリアライズする例があります。 –

+0

例がありますか? –

0

私はJacksonを選択しましたが、あなたが唯一のオブジェクトを読み書きすることになってもそうです。

  1. シリアライズされたJSONの診断/デバッグは、簡単に実行できます。
  2. このよく踏まパスに泊まるので、オブジェクトが、私は推測 `Serializable`ではありません例えば、http://www.baeldung.com/jackson-deserialization
関連する問題