Прошу заранее прощения за длинные участки кода и буду благодарен кто их просмотрит.
Исходный код
import java.io.*;
import java.util.ArrayList;
public class ListOfFunc implements Serializable{
interface Executable extends Serializable { void execute(); }
ArrayList<Executable> alFunc = new ArrayList<>();
private static Executable exec1 =new Executable() {
@Override
public void execute() { System.out.println("exec func1"); }
};
private static Executable exec2 =new Executable() {
@Override
public void execute() { System.out.println("exec func2"); }
};
public static void main(String[] args) throws IOException, ClassNotFoundException {
ListOfFunc lf1 =new ListOfFunc();
lf1.alFunc.add(exec1);
lf1.alFunc.add(exec2);
lf1.alFunc.get(0).execute();
lf1.alFunc.get(1).execute();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data1.dat"));
oos.writeObject(lf1);
oos.close();
System.out.println("after loading:");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data1.dat"));
ListOfFunc ex2 = (ListOfFunc) ois.readObject();
ois.close();
ex2.alFunc.get(0).execute();
ex2.alFunc.get(1).execute();
}
}
Отрабатывает на ура, сериализирует и десириализирует. Вывод:
exec func1
exec func2
after loading:
exec func1
exec func2
Но хочется сделать версию сериализацию, такой чтобы в исходной программе не описывать внутренности реализации функций, чтобы они выгружались (в виде байт-кода etc) и в дальнейшем подгружались
без описания реализаций функций.
Чтобы когда либо в прошлом сформировать банк функций, сохранить его в виде файла. И как-нибудь в дальнейшем загрузить таким вот простым способом (без описания тысяч тел функций завернутых в интерфейсы):
import java.io.*;
import java.util.ArrayList;
public class ListOfFunc 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"));
ListOfFunc ex2 = (ListOfFunc) ois.readObject();
ois.close();
// Запустить подряд все загруженные функции
for (int i = 0; i < ex2.alFunc.size(); i++) ex2.alFunc.get(i).execute();
}
}
Данный пример естественно даст ошибку local class incompatible: stream classdesc serialVersionUID = ... так как нет описания private static Executable. Может есть иные механизмы, не связанные с сериализацией, но имеющие заветные Save и парный Load для реализации последнего примера. Или, может, дадите мне направление в нужную сторону для реализации подобного?
P.S. Готов даже до Java8 дорасти.