KryoSerializer
Spark で使用するオブジェクトをシリアル化できるように、実装するクラスを作成しようとしています。私が抱えている問題は、すべてのクラスがパブリック インターフェイスを実装しているのに対し、実装しているクラスはすべてプライベートであることです。Kryo は、パッケージ外のプライベート クラスまたはインターフェイスのシリアライザーを定義することを許可したくないようです。
この問題が明らかになるのは、KryoSerializer
クラスを定義しようとすると、class [implementation] in package graph cannot be accessed in package [same package]
.
誰かが助けてくれることを望んでいるのは、この問題を解決するための戦略です。
Kryo が具体的なオブジェクトをシリアライズおよびデシリアライズしたい理由を理解しています。しかし、この場合、私はKryoSerializer
とにかく独自のものを定義しているので、実際にはインターフェイスのシリアライゼーションを定義する方が理にかなっています。Kryoをだまして正しいことをさせる方法はありますか?
(これが機能する理由は、インターフェイスでインスタンスを取得し、ストリームから書き込みまたは読み取りを行う関数を持つ関連があるObject
ためです。シリアライザーは、シリアル化形式のバージョン情報を追加しながら、本質的にこれらの関数をラップします。)
私が考えた 1 つの可能性は、リフレクション トリックです。private/final メンバーを含むクラスを逆シリアル化する場合、リフレクションを使用して private メンバーをアクセスおよび書き込み可能にし、値を設定してから、private/final に戻します。別のパッケージャーのプライベート クラスでそれが可能かどうかはわかりませんが、可能だとしてもかなり醜く非効率的です。
もう 1 つの可能性は、プライベート クラスを拡張する新しいクラスを定義し、それらの間で変換する暗黙のセットを定義することです。ただし、いくつかの理由でかなり醜いものであり、かなりの数のプライベートクラスが問題になっています。
誰でもアプローチを提案できますか? 避けるべき落とし穴についてアドバイスをお願いします。