2

コードは次のとおりです(簡略化):

public abstract class PageBase implements Serializable {
     private static final long serialVersionUID = -31905358958878336L;
}

public abstract class ListPage extends PageBase {

    public Controller getController() {
         // Controller is a class
         // that implements Serializable and does have an def. constr.
         return new Controller() {
              @Override
              public void someMethod() {
                  // DoSomething
              }
         };
    }
}

public class ProjectList extends ListPage {
}

逆シリアル化により、次のようにスローされます。

java.io.InvalidClassException: my.pkg.page.ListPage$1; no valid constructor

逆シリアル化は、IBMJSFコードのどこかで行われています。

何か案は?ありがとう!

4

5 に答える 5

3

my.pkg.page.ListPage$1匿名の内部クラスになります。ネストされたクラスを直列化することは、最良の場合には良い考えではありません (完全な JVM 名へのマッピングと「outer this」参照の処理が不十分です)。

例外は、最も派生した非基本クラスの引数なしのコンストラクターを見つけようとしているかのように見えます。これは、最も派生しSerializableていないクラスにアクセスできる必要がありますSerializable

于 2010-08-26T13:48:44.267 に答える
2

匿名Controllerを別のクラスとして定義することをお勧めします。

于 2010-08-26T14:07:23.913 に答える
1

問題は、のサブクラスがController非静的な内部クラスであるため、そのコンストラクターには、囲んでいるクラスのインスタンスを参照する暗黙の引数があることだと思います。これにより、コンストラクターはオブジェクトの逆シリアル化に使用できなくなります。

これらのオブジェクトをシリアライズしようとするのは悪い考えですが、内部クラスを変更してstaticデシリアライズを行うとうまくいくかもしれません。

于 2010-08-26T14:55:32.283 に答える
0

定義上、インスタンス化できない抽象クラスをシリアライズしようとしています。つまり、ListPage の定義では、次のことはできません。

ListPage l = 新しい ListPage();

ListPage と ProjectList から抽象修飾子を削除すると、すべて問題ありません。

于 2010-08-26T13:32:20.713 に答える
0

クラスではなくオブジェクトをシリアル化しますよね?あなたが示したすべてのクラスは抽象的であるため、インスタンス化することはできません。では、(逆) シリアル化しているのは何ですか?

このエラーは、クラスを "ListPage$1" (匿名の内部クラス) として参照しています。何が起こっているのかを理解するには、コードをもっと見る必要があると思います。

于 2010-08-26T13:38:47.837 に答える