Сериализация списка <> классов, объявленных с внутренним модификатором? - PullRequest
5 голосов
/ 15 февраля 2010

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

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

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 15 февраля 2010

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

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

1 голос
/ 15 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...