Сериализировать Список <> классов, объявленных с внутренним модификатором?

Я пытаюсь добавить сериализацию XML к довольно тривиальной структуре класса в C#. По существу существует единственный экземпляр корневого класса (назовите его Классом А), который содержит Список нескольких экземпляров некоторого другого класса (назовите его AnotherClass):

[XmlRoot("RootNode")]
public class AClass {
    [XmlElement("ListNode")]
    internal List otherObjects { get; set; }
}

public class AnotherClass {
    [XmlAttribute("Name")]
    internal string name { get; set; }
}

При сериализации я хотел бы за оба этих класса быть сериализированным вместе - то есть, если я сериализирую Класс А, его список AnotherClass сериализируется также (см. этот вопрос).

У меня есть это главным образом рабочее, но проблема состоит в том, что во время сериализации, XmlSerializer только, кажется, хочет иметь дело с public свойства класса - это не сериализирует AnotherClass вообще, если список объявляется internal.

Я пытался делать внутренности блока видимыми к сериализатору:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Xml")]

Это, казалось, ничего не сделало. Существует ли способ, которым я могу заставить XmlSerializer рекурсивно сериализировать списки объектов, которые объявляются внутренние?

5
задан Community 23 May 2017 в 11:47
поделиться

2 ответа

Вы на правильном пути ... за исключением того, что фактическая сериализация выполняется не System.Xml, а динамически сгенерированной сборкой. Вы не можете предсказать имя этой сборки (оно генерируется случайным образом), поэтому вы не можете использовать его в атрибуте InternalsVisibleTo .

Единственное решение - предварительно сгенерировать сборку сериализации XML. Это можно сделать с помощью инструмента XML Serializer Generator Tool (Sgen.exe) . Имя созданной сборки будет «YourAssembly.XmlSerializers»; это имя вы должны использовать в атрибуте InternalsVisibleTo .

6
ответ дан 14 December 2019 в 08:49
поделиться

Идея добавить атрибут InternalsVisibleTo хорошая, но я думаю, что проблема в том, что код сериализации Xml ищет только публичные типы в сборке.
Насколько мне известно, нет способа заставить XmlSerializer сериализовать или десериализовать внутренние типы, и вам придется либо объявить типы как public, либо написать свой собственный код сериализации.
Более того, в документации класса XmlSerializer явно указано, что только публичные свойства объекта будут сериализованы: "XML-сериализация - это процесс преобразования публичных свойств и полей объекта в последовательный формат (в данном случае XML) для хранения или транспортировки", так что это действительно похоже на проектное решение.

1
ответ дан 14 December 2019 в 08:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: