Чтение и запись нескольких экземпляров класса в файл JSON - PullRequest
0 голосов
/ 08 мая 2020

Мое приложение использует несколько ключевых объектов, сгенерированных во время выполнения. При перезапуске я теряю ссылку на них, делая данные в моей базе данных бесполезными. Я хочу сохранить их идентификаторы / информацию в файл, который будет загружаться при загрузке. (Признавая, что создание отдельной таблицы для них могло бы быть альтернативным решением, но я хочу использовать эту возможность для изучения файловых операций)

Раньше я создавал контейнерный класс для хранения семейства подклассов в ' 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();
    }
}
...