JsonSerializer молча не может десериализовать мой объект - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь сохранить свой реляционный объект в файле JSON, а не в базе данных SqlLite, поскольку я думаю, что это лучше подходит для того, что я пытаюсь сделать. Я использую Microsoft System.Text.Json.Serialization, но, похоже, это не работает.

Мой объект сохраняется в текстовом файле JSON следующим образом:

        var options = new JsonSerializerOptions
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            WriteIndented = true
        };
        
        options.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));    // Enums as strings instead of numbers
        string jsonString = JsonSerializer.Serialize(doclist, options);
        using (StreamWriter sw = new StreamWriter(target, false, System.Text.Encoding.UTF8))
        {
            sw.Write(jsonString);
            sw.Flush();
        }

Мой объект содержит пару свойств публикации DateTime c (да, с помощью get / set), пары свойств publi c string и четырех свойств publi c HashSet. В моем пробном прогоне заполняется только один из HashSet, для остальных трех задан пустой HashSet.

Сериализация в основном работает, под этим я подразумеваю, что объект сериализуется в текстовый файл JSON. Сгенерированный файл JSON также проверяется правильно. Однако я заметил, что, хотя мой заполненный HashSet правильно сериализован, только ДВА из оставшихся трех (все пустые, но не нулевые) сериализуются как пустой список '[]', другой просто опускается. Никаких исключений не генерируется.

Десериализация вообще не работает. Я использую следующий код для десериализации того же файла, который я сохранил. Строка JSON правильно считывается в jsonString, но десериализация не вызывает исключения и все же возвращает пустую (не нулевую) версию моего объекта со свойствами, установленными так же, как и конструктор без параметров. Другими словами, он НЕ заполняется данными, содержащимися в jsonString.

string jsonString = File.ReadAllText(filename, System.Text.Encoding.UTF8);
db = JsonSerializer.Deserialize<DocumentRegistry>(jsonString);

Я что-то здесь упускаю? или мне лучше использовать другую JSON библиотеку (бесплатно)?

...