私は将来実行できる関数のリストを作成したいと思います。関数のリストをシリアライズして復元する方法は?
まずリスト:
exec func1
exec func2
after loading:
exec func1
exec func2
しかし、私はだけのシリアル化情報を使用して明確なロードを使用しようとしたとき、私はClassNotFoundException for ExampleF$1
を得る:
import java.io.*;
import java.util.ArrayList;
class ExampleF implements Serializable{
interface Executable extends Serializable{ void execute(); }
ArrayList<Executable> alFunc = new ArrayList<>();
public static void main(String[] args) throws IOException, ClassNotFoundException {
ExampleF ex1 =new ExampleF();
Executable exec1 =new Executable() {
@Override
public void execute() { System.out.println("exec func1"); }
};
Executable exec2 =new Executable() {
@Override
public void execute() { System.out.println("exec func2"); }
};
ex1.alFunc.add(exec1);
ex1.alFunc.add(exec2);
ex1.alFunc.get(0).execute();
ex1.alFunc.get(1).execute();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data1.dat"));
oos.writeObject(ex1);
oos.close();
System.out.println("after loading:");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data1.dat"));
ExampleF ex2 = (ExampleF) ois.readObject();
ois.close();
ex2.alFunc.get(0).execute();
ex2.alFunc.get(1).execute();
}
}
がうまく働いた、出力がいた
import java.io.*;
import java.util.ArrayList;
class ExampleF implements Serializable{
interface Executable extends Serializable{ void execute(); }
ArrayList<Executable> alFunc = new ArrayList<>();
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data1.dat"));
ExampleF ex2 = (ExampleF) ois.readObject();
ois.close();
ex2.alFunc.get(0).execute();
ex2.alFunc.get(1).execute();
}
}
どうすればこの問題を解決できますか?
- 必要な機能の複数のリストを作成しますSerializeを
- はのみのみ()を実行使用して必要なファイルをダウンロードした後、将来的にそれを使用してください。
おそらく関数のArrayListを格納する他の方法がありますか? P.P.私はJava7を使用します(必要な場合はJava8にアップグレートできます)。
ありがとう、私はそれを試しました。しかし、この場合、2番目の例ではすべてのプライベートな静的内部クラスを記述できるはずです(逆シリアル化と関数実行コードのみ)。私はコンパクトなコード(関数の記述なし)を持っていたいと思います。シリアル化ファイルから関数のコードを取得したいと思います。または、私はローカルクラスの互換性のない例外を取得します:stream classdesc serialVersionUID = .... – Joysi
@Joysiあなたがやりたいことははるかに複雑です。クラスコンテンツを直列化し、クラスをロードするために特定のクラスローダーに依存する必要があります。おそらく最も単純な方法は、RMIをそのまま使用することです。https://docs.oracle.com/javase/tutorial/rmi/ –
標準的な方法はありません**直列化** Javaバイトコードの関数をさらに直列化する可能性あり.ArrayListの実行可能項目として。 – Joysi