Я пытаюсь сохранить свой реляционный объект в файле 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 библиотеку (бесплатно)?