В чем разница между [OptionalField] и [NonSerialized]

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

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

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

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

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

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

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

ОБНОВИТЬ:

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам