В чем разница между [OptionalField] и [NonSerialized] - PullRequest
6 голосов
/ 06 апреля 2010

Я сталкивался с этим вопросом на трансцендере:

Что следует применять к полю, если его значение не требуется при десериализации?

Me = [NonSerialized], ANSWER = [OptionalField]

Моя реакция на кишечник была NonSerialized, но Transcender говорит, что я неправ.У меня есть хорошая идея, на что обращать внимание в отношении атрибута [Nonseralized], но все же мне бы очень хотелось, чтобы это прояснилось.

Насколько я могу судить, первое имеет отношение к конфликтам версиймежду новыми и более старыми версиями одной и той же сборки.Последнее больше касается не сериализации поля FULLSTOP.Есть ли что-нибудь еще, что могло бы отделить этих двоих?MSDN на самом деле мало говорит об этом, поскольку они оба используются в BinaryFormatters и SoapFormatter с XMLFormatter с использованием XMLIgnoreAttribute.

Мой второй вопрос: можете ли вы смешивать и сопоставлять один из двух атрибутов?Я еще не использовал их.

Просто добавлю это, но мой ответ как-то связан со способом [OnDeserialized] и реализованным интерфейсом IdeserilizationCallback?

ОБНОВЛЕНИЕ:

Я знаю, что необязательный атрибут поля не сериализует значение, содержащееся в элементе данных, но NonSerialized даже не сериализует элемент данных или его значение.

Ответы [ 2 ]

6 голосов
/ 06 апреля 2010

Эти два атрибута используются для противоположных сторон уравнения сериализации.

Когда вы используете [NonSerialized], вы говорите «это поле вообще не должно быть сериализовано», так что это скорее атрибут «сэкономить время». По сути, вы говорите, что поле не имеет значения для сериализованного состояния объекта.

Когда вы используете [OptionalField], с другой стороны, вы все равно собираетесь сериализовать поле. Однако, если поле равно пропущено при время чтения (когда поток десериализован в объект), исключение не будет выдано. Этот атрибут действительно предназначен для того, чтобы позволить вам добавить новое поле к существующему сериализуемому типу, не нарушая совместимость. Старые версии объекта (в которых отсутствует это поле) будут десериализованы в обычном режиме.

1 голос
/ 06 апреля 2010

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

По первому вопросу вы в значительной степени прибили его к голове. [OptionalField] в основном позволяет старым сериализациям быть совместимыми с более новыми определениями. [NonSerialized] означает, что вы не найдете его в сериализованных данных.

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

...