Джава:Сохранить объекты в текстовый файл?Есть ли готовые решения?

StackOverflow https://stackoverflow.com/questions/170554

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Три вещи, которые следует отметить относительно сериализации:

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

Другие советы

Да, концепция, которую вы ищете, называется сериализацией. У 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? В таком случае,   можем ли мы когда-либо упорствовать объекты этого   тип? Ответ да, пока мы   расскажите механизм сериализации нашего   намерения, отмечая наш класс   Объект потока как временный.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top