Лучший способ хранить данные в Java? - PullRequest
1 голос
/ 20 апреля 2011

В настоящее время я работаю над видеоигрой и хочу, чтобы пользователь мог сохранить своего персонажа в новом файле.Я знаю, как использовать файл io (по большей части), но я использовал 'serialize' для сериализации целого объекта (который содержит все переменные для символа) и сохранения его в файл.Проблема в том, что я постоянно обновляю объект и вносю в него изменения, поэтому, когда я пытаюсь загрузить старого персонажа новым объектом, он выдает ошибки и вылетает.То же самое с уровнями (объект, содержащий несколько 2-мерных массивов переменных).

Должен быть лучший способ сделать это, чтобы он был совместим с будущими версиями.Если есть способ, кто-нибудь, пожалуйста, предложите некоторый исходный код и / или ссылку на хороший учебник?Спасибо за помощь, спасибо !!!

Ответы [ 6 ]

3 голосов
/ 20 апреля 2011

Используйте XML или встроенную базу данных (быструю и легкую), такую ​​как Derby или H2. Вы даже можете использовать простой старый файл свойств.

На самом деле, посмотрите, будет ли файл свойств работать на вас. И только если это не сработает, попробуйте XML или подход со встроенной базой данных.

1 голос
/ 20 апреля 2011

, если вы ищете сериализаторы Java, вот эталон для вас https://github.com/eishay/jvm-serializers/wiki/

Apache Avro , кажется, работает хорошо.

Другой способ - сохранить значения в постоянном хранилище, например HSQLDB или H2 db , загрузить их в память при запуске и сохранить при необходимости. SQLite (для проверки драйверов это )

0 голосов
/ 20 апреля 2011

Эта игра использует java.util.prefs.Preferences для кроссплатформенного удобства.Поскольку ключи хранятся индивидуально, новые дополнения редко мешают существующим записям.

0 голосов
/ 20 апреля 2011

Еще один вариант, который следует учитывать, поскольку вы уже используете сериализацию, вы можете реализовать Externalizable вместо Serializable. Код, который вы используете для сериализации объектов, останется прежним. Однако в вашем классе вы бы точно указали, как вы хотите, чтобы он сериализовался путем переопределения readExternal() и writeExternal(). E.g.:

public class MyClass implements Externalizable {
    private int foo;
    private String bar;

    public readExternal(ObjectInput in) {
        foo = in.readInt();
        bar = in.readUTF();
    }

    public writeExternal(ObjectOutput out) {
        out.writeInt(foo);
        out.writeUTF(bar);
    }
}

Просто будьте уверены, что сохраняете порядок при чтении и письме. Попробуйте добавить только поля, однако, если вам нужно удалить поле, оставьте пробел для учета старых версий.

В конечном счете, хотя вы вносите много изменений, лучше всего переключиться на свойства или файл XML, как предлагает LES2. Таким образом, он будет более переносимым и читабельным.

0 голосов
/ 20 апреля 2011

Если вы расширяете ваши объекты обратно совместимыми способами, то есть добавляете поля, а не удаляете поля.Убедитесь, что вы объявили serialVersionUID в соответствии с сериализуемым Javadoc.

http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

0 голосов
/ 20 апреля 2011

Вы можете реализовать Externalizable вместо Serializable, а в методах readExternal() и writeExternal() вы можете поместить логику для чтения / записи объекта.Таким образом, вы получаете полный контроль над сериализацией / десериализацией и можете довольно легко вносить изменения.В качестве альтернативы вы можете использовать сериализацию JSON, используя Gson .Я не рекомендовал бы XML, но если вы хотите, вы можете проверить xstream на то же самое.

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