逆シリアル化エラーが不足しているクラスが交換されるプロトコルをトリガーするAkka システムをセットアップしようとしています。この目的のためにカスタム デシリアライザーを使用します。このデシリアライザーは、欠落しているクラスに関連する例外をキャッチすると、アプリケーション アクターに特定のメッセージを返します。
簡単に言えば、リモート システム B がオブジェクトをシステム A に送信します。逆シリアル化中にシステム A がClassNotFoundErrorまたはNoClassDefFoundErrorを取得した場合、システム A はシステム B に未定義クラスのバイトコードを要求します。A が B からの応答 (クラス名と Array[Byte] 型のオブジェクトのペア) を受信すると、クラスを登録できるため、次にシステム B がオブジェクトをシステム A に送信したときに、A はそれを逆シリアル化できます。正しく。
さて、2つのアプローチがあります
1) システム B も、要求されたクラスに関連するすべてのクラスを送信します。
2) システム B は、要求されたクラスのバイトコードのみを送信します (その依存関係は除きます)。
ここで、アプローチ 2 に注目して、次のシナリオを考えてみましょう。
- 1) B ===obj:X==> A (B はクラス X のオブジェクトを A に送信します)
- 2) X が Y,Z に依存しているとしましょう
- 3) B <====X?==== A (A がクラス X を B に尋ねる)
- 4) B =====X====> B (B はクラス X を A に提供し、A はクラス X を登録します)
- 5) B ===obj:X==> A (依存関係 Y がないため、A はエラーになります)
- 6) B <====Y?==== A
- 7) B =====Y====> A (A はクラス Y を登録します)
- 8) B ===オブジェクト:X==> A
- 9) B <====Z?==== A
- 10) B =====Z====> A (A はクラス Z を登録します)
- 10) B ===obj:X==> A (OK、最終的に A はクラス X のオブジェクトを逆シリアル化できます)
このようなプロトコルは機能するはずですが、実際には、次の理由により、手順 5 ~ 7 でループが発生します。
NoClassDefFoundError: Lexamples/DemoDecentralizedAkkaPlatformCmdLineMain2$AggregateProgram$$anonfun$main$3$$anonfun$apply$5;
次のクラスを登録します。examples.DemoDecentralizedAkkaPlatformCmdLineMain2$AggregateProgram$$anonfun$main$3$$anonfun$apply$5
ただし、NoClassDefFoundError が発生し続けます。
最初の「L」と末尾の「;」を取り除いていることに注意してください。クラス名から、および「/」を「。」に置き換えます。そうしないと、システム B でエラーが発生します。
質問の複雑な定式化で申し訳ありません。