2つの新しいパラメータを追加することによってクラスを変更する必要があります。このクラスはKryoとシリアライズされています。 私は現在、ストリームを停止するたびに、このクラスに関連する情報、特にRDDを維持しています。 ストリームを再起動すると、以前に保持した情報をロードし、停止した時点と再起動した時点の整合性を保つために使用します。Kryo:クラスの古いバージョンを非直列化する
クラスIはこれらの新しいパラメータを必要とするため、新しいパラメータとして新しいkryo.writeObject(output, object, ObjectSerializer)
とkryo.readObject(input, classOf[Object], ObjectSerializer)
を追加してクラスとシリアライザを変更しました。
ここで、ストリームを再起動するたびに「Unregistered class ...」という例外が発生します。
ストリームを停止したときに保持していた情報に含まれていないオブジェクトを逆シリアル化しようとすると、明らかです。 これらのデータを削除し、以前の実行がない場合と同様にストリームを開始すると、例外は発生しません。
この例外を回避する手段はありますか? これらのパラメータがない場合のデフォルト値を指定することで
はありがとうございましたEDIT: Kryo issue 194:私は有益な何かを見つけ
私は前を見ていません。
この男は、使用するべきデシリアライザのバージョンを定義するだけで、バージョン管理を実装しました。 これは簡単な解決策ですが、私が開発しているコードを書いた会社は、互換性について考えていなかったので、新しいシリアライザの前に残っていたすべてのデータをウィンドウから取り除かなければならないと思います。
誰かがより良い解決策を提案できるかどうか教えてください。
EDIT 2:
はまだこのような状況で問題が発生しました。 ここで説明したようにCompatibleFieldSerializerを使用しようとしました:CompatibleFieldSerializer Example このシリアライザを登録して、以前使用したカスタムシリアライザを登録しないでください。 結果は、永続データをリロードするときにjava.lang.NullPointerException
となります。 以前のデータが保存されていない場合でも問題はありません。ストリームを開始したり、新しいデータをシリアル化したり、ストリームを停止したり、デシリアライズしたり、ストリームを再開したりすることができます。 解像度についてはまだ手がかりがありません。