Java: сохранить объекты в текстовом файле? Есть готовые решения? - PullRequest
7 голосов
/ 04 октября 2008

Я хочу сохранить объекты, сгенерированные в программе. После перезапуска приложение должно автоматически загрузить все объекты в массиве. Я хочу записать их в файл и разобрать их после перезапуска. Есть ли другие более умные возможности, чем сделать это вручную? Спасибо

Ответы [ 8 ]

13 голосов
/ 04 октября 2008

Да, концепция, которую вы ищете, называется сериализацией. На Sun есть прекрасный урок .

Идея состоит в том, что классы, которые вы хотите сохранить, должны реализовывать интерфейс Serializable. После этого вы используете java.io.ObjectOutputStream.writeObject () для записи объекта в файл и java.io.ObjectInputStream.readObject () для его считывания.

Вы не можете сериализовать все, поскольку есть вещи, которые не имеют смысла сериализовать, но вы можете обойти их. Вот цитата об этом:

Базовый механизм Java Сериализация проста в использовании, но Есть еще кое-что знать. Как упоминалось ранее, только объекты помечены Сериализуемый может быть сохранен. java.lang.Object класс не реализовать этот интерфейс. Следовательно, не все объекты в Java могут быть сохраняется автоматически. Хорошие новости является то, что большинство из них - как AWT и Swing GUI компоненты, строки и массивы - сериализуемы.

С другой стороны, определенный классы системного уровня, такие как Thread, OutputStream и его подклассы, и Сокет не сериализуем. В самом деле, это не имело бы никакого смысла, если бы они мы. Например, поток работает в моя JVM будет использовать мою систему объем памяти. Сохраняя это и пытаясь запускать его в своей JVM не имеет смысла совсем. Еще один важный момент о java.lang.Object не реализует Сериализуемый интерфейс - это то, что любой класс, который вы создаете, который распространяется только Объект (и никакой другой сериализуемый классы) не сериализуемы, если вы сами реализуете интерфейс (как и в предыдущем примере).

Эта ситуация представляет проблему: Что делать, если у нас есть класс, который содержит экземпляр Thread? В таком случае, можем ли мы когда-либо упорствовать объекты этого тип? Ответ да, пока мы расскажите механизм сериализации нашего намерения, отмечая наш класс Потоковый объект как переходный процесс.

4 голосов
/ 04 октября 2008

Вы можете использовать класс Berkeley DB PersistentMap для сохранения ваших (Serializable) объектов в реализации Map (кеш), которая сохраняет их в файл. Он довольно прост в использовании и означает, что вам не нужно беспокоиться о том, что и где сохранять.

Три замечания по поводу сериализации:

  1. Как вы собираетесь справляться с изменениями схемы (т. Е. Изменять данные, из которых состоят ваши классы - например, добавляя новое поле)
  2. Что произойдет, если ваши файлы будут повреждены? В зависимости от того, насколько надежным должно быть хранилище вашей программы, будет зависеть ваше решение о том, как вы сохраняете данные, которые ваши объекты неявно содержат. Помните, что вы всегда можете использовать реляционную базу данных, такую ​​как MySQL , а затем преобразовать эти данные в ваши объекты
  3. Нужно ли вам иметь возможность просматривать или запрашивать данные вне вашей программы? Что делать, если вы хотите ответить на простой вопрос типа «Сколько объектов имеет свойство X?» Это легко сделать, если вы использовали (реляционную) базу данных; не так просто, если вы сериализовали вещи в файлы!
2 голосов
/ 04 октября 2008

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

Примеры включают проблемы безопасности, наследование и, что наиболее важно, возможность публичного «замораживания» API с его реализацией (например, в разных версиях программного обеспечения). Опять же, все они продвинуты и не должны вас сдерживать.

0 голосов
/ 14 декабря 2012

Интересно, почему никто не упомянул JSON и, например, сериал Джексона JSON .

0 голосов
/ 25 июня 2009

Я согласен с Mjlee, что Протокол буфера от Google является лучшим способом хранения объектов, чем оригинальный способ сериализации. Посмотрите, и вам понравится.

0 голосов
/ 06 октября 2008

Я не использовал его, но Google Code недавно выпустил protobuf .

0 голосов
/ 06 октября 2008

Вы также можете рассмотреть возможность использования XML-кодировки, которая, как мне кажется, имеет больший срок службы, чем сериализация. Используйте java.beans.XMLEncoder/XMLDecoder классы.

0 голосов
/ 04 октября 2008

java.io.Object [Input / Output] Stream - это два класса, на которые нужно обратить внимание.
Любой класс, который вы хотите сохранить в файле, должен реализовать интерфейс java.io.Serializable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...