シリアル化イベントをどのように受け取りますか? 定義できます
void writeObject(ObjectOutputStream out) {
// handle event
out.defaultWriteObject(this);
}
Javaシリアライゼーションでは、このメソッドはオブジェクトがシリアライズされるときに呼び出されます。Kryoで同じことをどのように行いますか? と の両方KryoSerializable
にExternalizable
デフォルトのシリアル化の問題があります。イベント ハンドラーを呼び出すと、デフォルトの読み取り/書き込みオブジェクトが必要になります。しかし、そんなことはありません!? FieldSerializer
inを呼び出しread(Kryo, Input)
てオブジェクトのフィールドを読み取ることはできますが、現在のオブジェクトに値を設定する代わりに、新しいオブジェクトが生成されます。このため、カスタム シリアライザーを導入しようとしました。
Serializer def = kryo.getDefaultSerializer(A.class)
kryo.addDefaultSerializer(A.class, new Serializer() {
public void write(Kryo kryo, Output output, Object object) {
((A)object).serializationEvent();
def.write(kryo, output, object);
ただし、A のサブクラスがserializationEvent()
イベントを受け取ると、A.class フィールドのみがシリアル化されると述べました。したがって、これは では機能しませんclass B extends A
。Natan が提案した解決策も試しましたregister(A.class, new FieldSerializer(A.class, myhandler
。これにより、サブクラスを含むすべてのフィールドがシリアル化されますが、カスタム シリアライザーはサブクラスに対してまったく呼び出されません。そのため、Kryo のカスタマイズは最終クラスでのみ機能することにしました。ネイサンは、この結論は「無効」であり、KryoSerializable ソリューションは「アプリケーション固有」であり、そうでなければ「失礼」だと考えています。そのような解決策にもかかわらず、私は発見した一般的な方法を公開することにしました.