Каково различие между [OptionalField] и [Несериализированный]

Я столкнулся с этим вопросом на transcender:

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

Меня = [несериализированный], ОТВЕТЬТЕ = [OptionalField]

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

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

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

Просто бросок этого там, но моего ответа имеет некоторое отношение к пути [OnDeserialized], и интерфейс IdeserilizationCallback реализован?

ОБНОВЛЕНИЕ:

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

6
задан DanM7 9 October 2012 в 16:55
поделиться

2 ответа

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

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

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

6
ответ дан 17 December 2019 в 00:06
поделиться

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

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

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

1
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: