-2

Я пишу инструмент, который должен получить экземпляр java.io.Serializable из массива байтов.
Сложность в том, что «настоящий» класс не является (и не может быть ...) на пути к классам (я не буду объяснять, почему здесь ..).
Приведенный ниже код не будет работать на is.readObject() с ClassNotFoundException, потому что класс реализации не на пути к классам
Q:
ли можно добиться этого? отражением? используя Unsafe? используя подкласс класса ClassLoader? или...?Как десериализовать экземпляр «Сериализация» без класса реализации в пути к классам?

byte[] data = ... 
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));) { 
    Object o = ois.readObject(); 
    Serializable s = (Serializable)o; 
} 
+1

* Возможно ли это достичь? * Не без реализации. Да, вы можете написать «ClassLoader» для загрузки класса. Но тогда вы снова нуждаетесь в классе. –

+0

То же, что сказал Элиот. Сериализация Java отправляет данные только класса, а не самого класса (а не методы или определения того, что означают данные). Без класса вы потоплены. – markspace

+0

Я хотел бы знать, почему downvotes ... «плохо» задать такой вопрос? или вызвали пользователей в ошибке? или дать ложный anser? Я так не думаю .. – titou10

ответ

1

ли Iis можно достичь этого?

No.

отражением?

Номер

с помощью небезопасный?

No.

, используя вспомогательный класс ClassLoader?

Да, но классный загрузчик все же должен получить класс откуда-то. Хорошим примером является функция RMI codebase.

+0

Я работаю с JEE и JMS API. В JMS есть класс «ObjectMessage» (http://docs.oracle.com/javaee/7/api/javax/jms/ObjectMessage.html), который может инкапсулировать «сериализуемый» объект. Вы можете получить этот сериализуемый код с помощью метода getObject(). Этот метод работает, даже если класс реализации не находится в пути к классам. Поэтому, я думаю, мне нужно декомпилировать реализацию этого API, чтобы изучить, как они это делают – titou10

Смежные вопросы