Почему XmlSerializer требует, чтобы классы сериализованного объекта были объявлены как публичные? - PullRequest
0 голосов
/ 15 июля 2009

Хорошо известно, что для того, чтобы сериализовать ваши объекты с помощью XmlSerializer, вы должны объявить их классы как открытые - в противном случае вы получите исключение InvalidOperationException. Вопрос здесь в том, почему? Я Гуглил и обнаружил, что XmlSerializer фактически генерирует и компилирует совершенно новую сборку, а затем использует эту сборку для сериализации ваших объектов. Вопрос, тем не менее, почему он требует, чтобы класс был общедоступным, в то время как легко получить доступ к внутренним типам в моей сборке с помощью отражения?

Ответы [ 2 ]

2 голосов
/ 25 июля 2009

Просто потому, что он не использует отражение для сериализации / десериализации вашего класса - он напрямую обращается к открытым свойствам (и классам).

Использование refleciton для доступа к членам было бы чрезвычайно дорого, поэтому вместо этого, как вы упоминаете в своем вопросе, он генерирует класс сериализатора один раз с использованием отражения, кэширует его * и с этого момента использует прямой доступ к членам.

  • Я должен уточнить это: он генерирует сериализатор только один раз и кэширует его для определенных перегрузок конструктора в XmlSerializer. Для других он генерирует класс сериализатора каждый раз, когда вы создаете экземпляр сериализатора.

Пока вы используете vanilla конструктор, вы в порядке:

XmlSerializer ser = new XmlSerializer(typeof(MyType));
1 голос
/ 15 июля 2009

Простая причина в том, что так было с первого дня.

Кроме того, Reflection стоит дорого. Зачем это делать, если не нужно?

Кроме того, XML Serializer не предназначен для сериализации каждого класса в мире. Он предназначен для сериализации классов, предназначенных для сериализации. Таким образом, нет ничего сложного в том, чтобы убедиться, что необходимые данные находятся в открытых полях и свойствах открытого класса с открытым конструктором без параметров.

Только при попытке сериализации типа, не предназначенного для сериализации, возникают проблемы.

...