Какой самый простой способ сохранить объекты Java?

Прямо сейчас у меня есть Java-программа, классы которой в настоящее время являются POJO и хранятся в энергозависимой памяти. Это должно быть сохранено. Насколько я понимаю, два популярных варианта - это JDO и Java Persistence API. Для тех, кто мало знает о SQL, Torque и т. Д., Какой самый простой способ добавить постоянство в данные моей программы?

6 ответов

Решение

Традиционный способ сериализации в файловую систему - использование сериализации Java. Однако вам нужно внедрить Serializable везде.

Более простое решение заключается в сериализации в XML (а затем в дамп файловой системы) с использованием XStream. Вам не нужно реализовывать какие-либо интерфейсы, и большинство всего сериализуется и десериализуется без дальнейшего вмешательства. При необходимости вы можете дополнительно настроить сериализацию. Единственная проблема, с которой я когда-либо сталкивался - это сериализация внутреннего класса без преднамеренной сериализации содержащего внешнего класса (это связано с неявным this ссылка)

Сериализуйте объекты в файловую систему, если вы не знаете SQL или реляционные базы данных.

Вам нужно будет научиться JDBC использовать JDO, JPA, Hibernate или что-то еще. Если ваши POJO не очень сложны, я бы порекомендовал начать там и продвигаться вверх.

Убедитесь, что вы узнаете о нормализации и правильном оформлении индексов.

Самый простой способ, с которым я столкнулся, это db4o:

ObjectContainer db = Db4o.openFile(location);
db.store(myObject);
List<MyObject> myObjects = db.query(MyObject.class);

Плюс есть действительно хорошие способы сделать запрос другими способами.

Если сериализация является опцией, рассмотрите возможность использования API распространенности, такого как prevalayer или Space4J (более поздняя версия). О распространенности объекта:

Распространенность - это концепция, начатая Клаусом Уестефельдом, о том, как хранить данные в реальном объектно-ориентированном виде, используя только снимки памяти, журналы транзакций и сериализацию.

Прочтите эту статью, чтобы узнать больше по этой теме (подробнее о Google).

DataNucleus - это самый простой способ, поскольку он предоставляет API-интерфейсы JDO и JPA для сохранения практически любого типа хранилища данных, которое вы когда-либо захотите. Зачем писать весь этот код JAXB в одном из других ответов, когда DataNucleus делает это за вас? Все поддержано стандартами Java

Похоже, вы хотите сохранить в БД. Однако, чтобы избежать сложностей с БД, одним из простых решений для сохранения POJO в файловой системе является их сериализация в XML-документ. Java 1.6 API включает в себя инфраструктуру JAXB, найденную в пакете javax.xml.bind. Чтобы использовать JAXB, вы по существу аннотируете свой POJO и создаете маршал и демаршал методы, такие как:

@XmlRootElement(name="Foo")
public class Foo {

   @XmlElement(name="Bar")
   public int mBar;

   public static void marshal(Foo foo, OutputStream out) IOException {      
      try {
         JAXBContext jc = JAXBContext.newInstance(Foo.class);
         Marshaller marshaller = jc.createMarshaller();
         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
         marshaller.marshal(qaConfig, out);
      }
      catch (JAXBException ex) {
         throw new IOException(ex);
      }
      finally {
         out.close();
      }
   }

   public static Foo unmarshal(InputStream in) throws IOException {

      try {
         JAXBContext jc = JAXBContext.newInstance(Foo.class);
         Unmarshaller unmarshaller = jc.createUnmarshaller();

         return (Foo)unmarshaller.unmarshal(in);
      }
      catch (JAXBException ex) {
         throw new IOException(ex);
      }
      finally {
         in.close();
      }
   }
}

Допустим, вы сохраняете экземпляр Foo, где mBar равен 42, тогда это решение создаст файл XML примерно так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo>
   <Bar>42</Bar>
</Foo>
Другие вопросы по тегам