Сериализация списка объектов

Есть объект класса ExcelStylesheet, который подлежит сериализации в JSON.

public class ExcelStylesheet
{        
    public Dictionary<int, uint> CellFormatIndexes { get; set; }        
    public List<Font> Fonts { get; set; }        
    public List<CellFormat> CellFormats { get; set; }        
    public List<Fill> Fills { get; set; }        
    public List<Border> Borders { get; set; }
}

Пытаюсь сериализовать в файл.

string json = JsonConvert.SerializeObject(stylesheet);
File.WriteAllText(filePath, json);

На выходе получаю:

{"CellFormatIndexes": {"0": 9,"1": 10},"Fonts": [[[],[]],[[],[],[]]],"CellFormats": [[[]],[[]]],"Fills": [[]],"Borders": [[]]}

Почему списки объектов сериализуются таким образом и как сделать нормальную сериализацию?

Используемая библиотека: Newtonsoft.Json. Списки из объектов классов библиотеки DocumentFormat.OpenXml


Ответы (1 шт):

Автор решения: Pavel Mayorov

Потому что все эти классы наследуют от OpenXmlElement, который является коллекцией дочерних элементов. Newtonsoft.Json все такие классы сохраняет как массивы.

Если вам нужно записать объект в файл для последующего чтения - лучше преобразуйте эти объекты в строку через OuterXml при записи, а при чтении преобразуйте обратно через принимающий строку конструктор.

Можете попытаться написать свой JsonConverter для наследников OpenXmlElement.

→ Ссылка