Самосериализация Java

1

Я пытаюсь написать класс, который имеет методы exportToString и importFromString. ExportToString сериализует этот класс в строку JSON:

public String exportToString() {
    Gson gson = new Gson();
    String json = gson.toJson(this);
    return json;
}

Мне нужно написать importFromString (String str). Проблема в том, что "эта" переменная является окончательной, и я не могу полностью переназначить это значение. Это то, что у меня есть:

public void importFromString(String str) {
    Gson gson = new Gson();
    Object obj = gson.fromJson(str, this.getClass());
    this = (PlayerData) obj;          // ERROR: cannot assign value to final variable this
}

PS Извините за мой английский

  • 2
    importFromString должен быть статическим методом, возвращающим новый экземпляр PlayerData.
  • 1
    Вы можете либо вернуть новый PlayerData либо обновить каждую переменную текущего объекта, чтобы отразить данные из json
Показать ещё 2 комментария
Теги:
serialization
gson
this
final

2 ответа

0
Лучший ответ

Я думаю, что самый простой способ сделать то, что вы хотите, - сделать второй метод статическим и вернуть экземпляр объекта, представленного в строке:

public static PlayerData importFromString(String str) {
  Gson gson = new Gson();
  Object obj = gson.fromJson(str, PlayerData.class);
  return (PlayerData) obj;
}

Затем вы вызываете его следующим образом:

PlayerData obj = PlayerData.importFromString(someString);
  • 0
    Хорошо, возможно это самый простой способ, спасибо
  • 0
    Или возможно сделать оба метода статичными? Вероятно, неплохо бы отделить логику сериализации / десериализации от реального бизнес-объекта. Что если вам нужно сериализовать его в какой-то другой формат (например, XML), должен ли PlayerData знать об этом?
Показать ещё 1 комментарий
0

Что-то вроде этого, может быть?

public static PlayerData importFromString(String str) {
    Gson gson = new Gson();
    Object obj = gson.fromJson(str, PlayerData.class);
    return (PlayerData) obj;
}
  • 1
    Вы должны вернуть его!
  • 0
    Спасибо, я обновил код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню