Как работает сериализация в .Net - PullRequest
5 голосов
/ 21 января 2009

У меня такое ощущение, что это репост, но я не могу найти какую-либо хорошую информацию об этом. Мне просто интересно, как на самом деле работает сериализация (ну на самом деле десериализация). Что мне интересно, так это сказать, что у меня есть свойство, которое на самом деле не поддерживается частным полем; i.e.:

public string SomeProp {
   get {
      return GetValue("SomePropKey");
   }
   set{
      SetValue("SomePropKey", value);
   }
}

При десериализации вызывается ли сеттер? Получатель вызывается при сериализации, потому что при сериализации объекта правильное значение записывается в выходной поток. Я знаю, это кажется странным обстоятельством, но что на самом деле происходит? Или я просто слишком усложняю это ...

Ответы [ 3 ]

7 голосов
/ 21 января 2009

Это полностью зависит от механизма, который вы используете для сериализации.

Если вы используете XmlSerialization, тогда да, вызывается сеттер.

Если вы используете сериализацию контракта данных (DataContractSerialization), то вызывается метод получения / установки, если вы применяете атрибут DataMember к свойству (а не к его вспомогательному полю).

Если вы используете оригинальный механизм сериализации в .NET (реализация IFormatter), то этот сценарий невозможен, поскольку он будет только сериализовать значения, хранящиеся в полях.

0 голосов
/ 21 января 2009

Я знаю, что это не прямой ответ на ваш вопрос, и вы уже получили ответ, который искали. Но я не хотел воздерживаться от этого. Вы можете просмотреть источники библиотеки базовых классов, используя Reflector . Это отличный способ узнать больше о внутренностях платформы .net и расширить свои знания.

0 голосов
/ 21 января 2009

Вы имеете в виду сериализацию XML или «обычную» сериализацию (мыло / двоичный файл), поскольку -afaik- эти 2 метода сериализации отличаются.

AFAIK, если вы используете BinaryFormatter или SoapFormatter, поля сериализуются / десериализуются, а не свойства.
Что касается десериализации, я считаю, что используется специальный 2-аргументный конструктор, имеющий аргументы SerializationInfo и StreamingContext.

Но ничто не мешает вам взять под контроль процесс сериализации с помощью интерфейса ISerializable. Затем, если вы хотите, чтобы ваше значение было установлено с помощью вашего свойства, я думаю, вы можете сделать это идеально.

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