Мое приложение использует несколько ключевых объектов, сгенерированных во время выполнения. При перезапуске я теряю ссылку на них, делая данные в моей базе данных бесполезными. Я хочу сохранить их идентификаторы / информацию в файл, который будет загружаться при загрузке. (Признавая, что создание отдельной таблицы для них могло бы быть альтернативным решением, но я хочу использовать эту возможность для изучения файловых операций)
Раньше я создавал контейнерный класс для хранения семейства подклассов в ' Concept 'класс. Отправка этого клиенту Javascript работала нормально, поскольку JS не чувствителен к приведению типов. Когда я попробовал это с получателем Java, моим сервером, я узнал о «стирании типа». ClassCastExceptions генерируются, преобразуя содержимое моей концепции Container в подклассы, которые я знаю. Я читал записи StackOverflow (SO), которые намекают, что другие Json решения, помимо Gson, который я использую, могут запоминать тип, но я не хочу переключать библиотеки.
Затем я попытался написать ArrayList , CommonNoun является подклассом Concept, отказавшись от сохранения множества различных подтипов в одном файле и размещения их по разным файлам для каждого типа:
new Gson().toJson(cNArray, ArrayList<CommonNoun>, writer);
Второй параметр не принимается во внимание Json, и я не вижу для него никаких JavaDocs. Пробовал разные комбинации ArrayList, ArrayList.class и т. Д.
Пытался отправить массив:
new Gson().toJson(importantCommonNouns, CommonNoun.class[], writer);
Подпись метода тоже не понравилась.
Затем я добавил их в файл по одному:
new Gson().toJson(cNoun1, CommonNoun.class, writer);
writer.flush();
new Gson().toJson(cNoun2, CommonNoun.class, writer);
writer.flush();
В результате получился файл с такой структурой:
{x}{y}
Ниже по потоку я не знал как это читать:
CommonNoun[] specialCommonNoun = new Gson().fromJson(buffered, CommonNoun.class);
или
CommonNoun specialCommonNoun1 = new Gson().fromJson(buffered, CommonNoun.class);
CommonNoun specialCommonNoun2 = new Gson().fromJson(buffered, CommonNoun.class);
Возможно, мне следует научиться делать File .lines () на принимающей стороне, используйте от Json на строку для получить один экземпляр и pu sh новую строку между последовательной записью объектов, как указано выше?
Я мог бы прочитать в ОС, что я мог бы использовать Type или TypeToken для передачи подкласса, но на самом деле не могу осмыслить эти классы даже в менее сложных условиях. Я открыт для этого, если это лучшая практика, но был бы признателен за решение, описанное таким образом, чтобы сделать скидку на это ограниченное понимание.
Совсем недавно я начал создавать класс CommonNounContainer, чтобы расширить мой класс ConceptContainer из прошлого. Когда я вошел в него, я понял, что подклассы не будут работать из-за ограничений приведения снова к частному содержимому контейнера. Создание зеркальной копии ConceptContainer, в которой были бы все его методы и содержимое, за исключением замены ссылок на Concept на CommonNoun, казалось неправильным.
public void saveRootNodesToText(String databaseName) {
try {
FileWriter fileWriter = new FileWriter(jsonRootPath + databaseName + "\\" + jsonRootCommonNounFile, true);
BufferedWriter buffered = new BufferedWriter(fileWriter);
JsonWriter writer = new Gson().newJsonWriter(buffered);
new Gson().toJson(GetPortal.getValueCommonNoun(), CommonNoun.class, writer);
writer.flush();
new Gson().toJson(GetPortal.getValueCommonNoun(), CommonNoun.class, writer);
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void initializeRootNodesFromText(String databaseName) {
try {
FileReader fileReader = new FileReader(jsonRootPath + databaseName + "\\" + jsonRootCommonNounFile);
BufferedReader buffered = new BufferedReader(fileReader);
CommonNoun specialCommonNoun = new Gson().fromJson(buffered, CommonNoun.class);
CommonNoun specialCommonNoun2 = new Gson().fromJson(buffered, CommonNoun.class);
//ToDo: set root CommonNouns to use these loaded values
} catch (Exception e) {
e.printStackTrace();
}
}