Сериализаторы VB.Net будут выполнять код в открытых членах? - PullRequest
0 голосов
/ 06 февраля 2009

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

Пока что наше тестирование с помощью BinaryFormatter показывает, что оно просто записывает данные непосредственно в переменные-члены и из них. Он не проходит через любой из методов получения или установки. Сериализатор XML такой же?

Что если публичное свойство сделало что-то глупое, как Random (). Далее? Будет ли это сериализовано двоичным форматером? Похоже, что с XML Serializer вам нужно соответствующим образом декорировать этот элемент, чтобы он мог участвовать. Двоичный форматер, похоже, снова работает только с переменными-членами.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 06 февраля 2009

Вам нужны и геттер, и сеттер, иначе свойство не будет сериализовано. Причина этого в том, что сериализатор предполагает, что он не может установить значение, поэтому его транспортировка была бы бесполезной.

У вас даже может быть пустой сеттер, и он будет работать.

1 голос
/ 06 февраля 2009

Я только что провел быстрый тест с использованием XML Serializer. Чтобы ответить на ваш вопрос: Да, он использует геттеры во время сериализации и использует сеттеры во время десериализации.

EDIT

Нашел в документах:

В этом примере используется двоичный форматер для сериализации. Все, что вам нужно сделать, это создать экземпляр потока и средства форматирования, которые вы собираетесь использовать, а затем вызвать метод Serialize для средства форматирования. Поток и объект для сериализации предоставляются в качестве параметров для этого вызова. Хотя это явно не продемонстрировано в этом примере, все переменные-члены класса будут сериализованы - даже переменные, помеченные как закрытые. В этом аспекте двоичная сериализация отличается от класса XMLSerializer, который сериализует только открытые поля. Информацию об исключении переменных-членов из двоичной сериализации см. В разделе «Выборочная сериализация».

0 голосов
/ 06 февраля 2009

Думайте об этом так:

Допустим, вы десериализуете класс с несколькими сериализованными свойствами, и установщик последнего свойства имеет побочные эффекты, которые могут изменять значения другого свойства. Измененное свойство больше не отражает ваши сериализованные данные. Вы действительно хотите использовать этот сеттер?

С другой стороны, что, если для имущества нет резервного магазина? Возможно, это составное свойство, позволяющее вам получать и устанавливать значения всех остальных одновременно. Возможно, это свойство не должно быть сериализовано (или только это свойство должно быть сериализовано, в зависимости от того, как все работает), но могут быть и другие примеры. Как средство форматирования узнает, где назначить значение для такого свойства?

Так что это? Мне пришлось искать его, и я не смог быстро найти авторитетный источник, но похоже, что XmlSerializer использует геттеры и сеттеры, в то время как BinaryFormatter не использует геттеры или сеттеры.

И это имеет смысл. Моя первая мысль показала, что вы на самом деле не хотите использовать геттер / сеттеры. Мой второй пункт показал, что вы можете иметь , чтобы использовать их. Двоичный форматер может просто взять точное представление объекта в памяти, поэтому он пропускает метод получения / установки. XmlSerializer, у которого нет этой способности, должен использовать другой метод.

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

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