Механизм Java Serialization предполагает, что классы известны для десериализации JVM, он не отправляет определения классов.В частности, когда вы сериализуете объект Class
, вы не отправляете байт-код для этого класса, а только указываете принимающей ВМ искать объект Class
для класса с определенным именем.
Также обратите внимание, что объект Class
представляет класс, определенный в JVM, т.е. байт-код класса уже загружен.Нет смысла пытаться скомпилировать в класс, чтобы сгенерировать этот байт-код после загрузки класса.
Итак, нам нужно как-то передать определение класса клиенту.Самый простой подход состоит в том, чтобы сделать это, как любой другой класс, который нужен клиенту (упаковав его в jar-файл клиента или любым другим способом, который вы используете для установки клиентской программы).Если это невозможно, вы можете загрузить определение класса по сети, например, с помощью URLClassLoader
, или вы можете отправить файл класса через поток сериализации, а после получения его на клиенте использовать ClassLoader.defineClass
для загрузкиclass.
PS: Эта проблема полностью не зависит от того, назван класс или нет.Следующий тестовый код показывает, что объекты анонимных классов можно сериализовать и десериализовать очень хорошо (если у принимающей ВМ есть определение класса):
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
Serializable payload = new Serializable() {
@Override
public String toString() {
return "hello from the anonymous class";
}
};
oos.writeObject(payload);
oos.writeObject(payload.getClass());
}
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
System.out.println(in.readObject());
System.out.println(in.readObject());
}