2016-04-05 10 views
0

こんにちは私は別のクラスB(コンパニオンオブジェクトを持っている変数、さらにコンパニオンオブジェクトを持つ別のクラスCを指す変数を持つ)を指す変数を含むケースクラスAを持っています。クラスBとCは他のライブラリからのものです。ケースクラスAをシリアライズできる簡単な方法は何ですか?Scalaネストされたオブジェクトのシリアル化

case class A() { 
    val b = B 
} 

//B & C are defined in a library that I have no control of 
object B { 
    val c = C 
} 

class B{ 
    ... 
} 

object C{ 
    ... 
} 

class C{ 
    ... 
} 

答えて

0

これらのクラスはすでにSerializableている場合は、特別なことをする必要はありませんので、その答えの残りの部分は、彼らはありません想定しています。

これらのフィールドを他から再構築できる場合は、@transientとマークし、readObjecthttp://docs.oracle.com/javase/8/docs/api/java/io/Serializable.htmlで説明)を実装して復元します。残念ながら、あなたはreadObjectval Sを初期化することができないと、彼らは、あなたがそれらは同様writeObjectでから復元することができるものを保存する必要がない場合は

case class A() { 
    private var _b = B 
    def b = _b 
} 

のようなものを記述する必要があります。基本的にはそれらのすべてではないあなたのコントロール下でタイプのサポートを追加することができますので、

最後に、あなたは、KryoまたはScala Picklingのようなサードパーティのシリアライズライブラリのいずれかを使用することができます(そうでない場合は、標準のJavaでの型では動作しませんでしたライブラリ!)

+0

ありがとうございます。これは非常に役に立ちます!以前はScala Picklingを見ていましたが、コードには読み込まれませんでした(これはドキュメントや例が不足しているようです)。それをもう少し深く見て、私はテストし、それは働いた。 – Hebo

関連する問題