#java #hibernate #serialization #deserialization
#java #спящий режим #сериализация #десериализация
Вопрос:
У меня есть база данных MS 2000, которая используется нашим основным приложением Java. У этого приложения есть класс (назовем его car), который сериализуется и помещается в базу данных с использованием Hibernate3 в виде отдельного поля в таблице. Он имеет настройки по умолчанию в Hibernate и просто имеет атрибут ‘serialize’ в .hbm.xml файл сопоставления. Насколько я могу судить. Это в другом проекте, над которым я не работаю, поэтому я не знаю его слишком подробно, но могу получить исходный код. В любом случае, я работаю над вторым проектом, которому необходимо прочитать / использовать эти сериализованные данные из базы данных. Как я могу десериализовать его из другого приложения, которое не использует Hibernate? Я хочу знать, как это сделать, используя POJO, чтобы получить доступ к атрибутам и данным класса car? Есть ли что-то особенное, что нужно сделать, поскольку Hibernate в настоящее время является процессом, с помощью которого он сериализуется? Или я могу просто поместить возвращенный набор данных в массив байтов и преобразовать его в car — при условии, что мой класс car идентичен исходному коду класса car другого Java-приложения, который его сериализовал? TIA
Комментарии:
1. Вы пробовали просто десериализовать? Сработало ли это?
2. да, я сделал, и нет, это не так. иначе я бы не спрашивал.
3. разве Hibernate не использует для этого обычную сериализацию Java? Что означает «это не сработало» — что было сообщением об исключении / ошибке и т.д.?
4. вы даете нам какие-нибудь подсказки? Трассировка стека? Код? Если нет, вы, вероятно, не получите лучшего ответа.
5. кстати, вы были бы удивлены, сколько людей задают вопросы, не делая очевидных вещей … нравится пробовать это для себя или читать javadocs.
Ответ №1:
Вам нужно будет использовать java.io.ObjectInputStream() для чтения сериализованных байтовых данных из базы данных. Еще одна важная вещь — иметь файлы классов (т. Е. файлы jar или .class files) в пути к классу, которые соответствуют тем же ревизиям объектов, хранящихся в базе данных.
Если вы пытаетесь это сделать и получаете ошибки, вам следует либо отредактировать свой текущий пост, чтобы предоставить код и сообщения об ошибках, либо опубликовать новый вопрос, чтобы решить любую конкретную проблему, с которой вы столкнулись при десериализации данных.
Комментарии:
1. Спасибо. Это был комментарий к изменениям, который помог. Я использовал код разработки из SCM, но элементы, хранящиеся в БД, использовали более старую версию prod, и они были несовместимы. Я думал, что делаю что-то совершенно неправильное, но, судя по всем комментариям, я был на правильном пути, просто пропустил этот маленький фрагмент.
Ответ №2:
Я не вижу причин, по которым выполнение того, что вы предложили, не сработало бы.
Однако это действительно кажется хакерским и хрупким подходом. Действительно, использование сериализации / десериализации Java по своей сути хрупко … если вам когда-нибудь понадобится изменить закрытие сериализуемых классов.