2013-10-08 3 views
3

Мне нужно распечатать содержимое сериализованного объекта Java (например, java.io.Serializable POJO, извлеченного из кеша), не зная его класс априори.Как десериализовать объект неизвестного класса

Более конкретно, мне не нужно создавать экземпляр нового объекта с помощью классического ObjectInputStream, мне просто нужно получить простое читаемое человеком представление (желательно JSON) объекта без загрузки его класса в путь к классам.

Другими словами, мне нужно преобразовать байт [] (необработанный сериализованный объект) в строку JSON без переопределения ObjectInputStream.

+1

Класс, который вы десериализируете в своем классе? –

+2

Невозможно десериализовать объект, не имея его класса в пути к классам. Каким будет класс объекта? Если это необходимо, вы должны хранить JSON в кеше, а не сериализованные объекты Java. –

+0

@JBNizet: Это совершенно верно. Тем не менее, я думаю, @tieTYT пытается выяснить контекст вопроса. Возможно, сама причина этого требования заключается в том, что существует некоторый старый файл '.ser', который необходимо проверить, не имея класса (или этой версии класса) в пути к классам. И это потребует совершенно иного подхода, чем преобразование объектов в JSON. –

ответ

3

Короткий ответ будет no. Вы будете более или менее в конечном итоге переопределять функциональность ObjectInputStream, поскольку сериализация Java является проприетарным форматом, и вы должны реализовать спецификацию для чтения этого формата.

Однако в некоторой степени это не должно быть труднее, чем чтение других бинарных форматов; но вам нужно иметь в виду, что бинарные форматы могут быть легко читаемыми (bson, avro или, возможно, protobuf) или довольно сложными (например, PDF или Excel). Я бы разместил формат сериализации Java где-то посередине, но ближе к простым.

Сложность заключается в том, что при чтении ее значения вам придется угадывать тип поля (у ObjectInputStream есть эта информация из определения класса, поэтому было бы очень полезно иметь ссылку на исходный класс в вашем путь к классам, даже если вы не используете ObjectInputStream Или, если вы можете обеспечить, чтобы метаданные по-другому, ваша проблема решена

Update:.. После написания выше обескураживающий ответ, я нашел этот полезный SO вопрос: https://stackoverflow.com/questions/181448/gui-tool-to-browse-java-serialized-objects

+1

Ответ SO отключен. Обновите свой ответ. Это может быть многообещающей альтернативой: https://github.com/unsynchronized/jdeserialize – alfonx

4

Этот вид кажется многообещающим: https://github.com/unsynchronized/jdeserialize Я еще не пробовал.

Это полная реализация сериализации объекта потока Протокол, как описано в Сериализация спецификации, глава 6. Он не экземпляр каких-либо классов, описанных в потоке; вместо этого он создает промежуточное представление типов, экземпляров и значений . Из-за этого он может анализировать потоки без доступа к коду класса, который их сгенерировал.

+0

Он работает как шарм, печатает как схему (определение класса) в псевдо-Java, так и экземпляры объектов, хранящиеся в потоке. – dnet

+0

Отсутствует, к сожалению, способ перейти от представления jdeserialize обратно к сериализованному объекту. –

+0

@LiamWilliams, вы, вероятно, ошибаетесь, jdesiarialize зависит от ObjectOutputStream. В первом предложении их документов говорится: «jdeserialize - это библиотека, которая интерпретирует сериализованные объекты Java - данные, сгенерированные ObjectOutputStream» –

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