0

逆シリアル化エラーが不足しているクラスが交換されるプロトコルをトリガーする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 でエラーが発生します。

質問の複雑な定式化で申し訳ありません。

4

1 に答える 1