В чем разница между [OptionalField] и [NonSerialized]
Я сталкивался с этим вопросом на трансцендере:
Что следует применять к полю, если его значение не требуется при десериализации?
Me = [Несериализированный], ОТВЕТ = [OptionalField]
Моя внутренняя реакция была несериализированной, но Transcender говорит, что я неправ. У меня есть хорошая идея, на что обращать внимание в отношении атрибута [Nonseralized], но все же мне бы очень хотелось, чтобы это прояснилось.
Насколько я могу судить, первое имеет отношение к конфликтам версий между новыми и старыми версиями одной и той же сборки. Последнее больше касается не сериализации поля FULLSTOP. Есть ли что-нибудь еще, что могло бы отличить этих двоих? MSDN на самом деле мало говорит об этом, поскольку они оба используются в BinaryFormatters и SoapFormatter с XMLFormatter с использованием XMLIgnoreAttribute.
Мой второй вопрос: можете ли вы смешать и сопоставить один из двух атрибутов? Я еще не использовал их.
Просто добавлю это, но мой ответ как-то связан с тем, как реализован интерфейс [OnDeserialized] и интерфейс IdeserilizationCallback?
ОБНОВИТЬ:
Я знаю, что необязательный атрибут field не сериализует значение, содержащееся в элементе данных, но NonSerialized даже не сериализует элемент данных или его значение.
2 ответа
Эти два атрибута используются для противоположных сторон уравнения сериализации.
Когда вы используете [NonSerialized]
Вы говорите: "Это поле вообще не должно быть сериализовано", так что это скорее атрибут "сэкономить время". По сути, вы говорите, что поле не имеет значения для сериализованного состояния объекта.
Когда вы используете [OptionalField]
с другой стороны, вы все еще собираетесь сериализовать поле. Однако, если поле отсутствует во время чтения (когда поток десериализован в объект), исключение не возникает. Этот атрибут действительно предназначен для того, чтобы позволить вам добавить новое поле к существующему сериализуемому типу, не нарушая совместимость. Старые версии объекта (в которых отсутствует это поле) будут десериализованы как обычно.
Просто игра на английском языке, необязательная и необязательная, означает одно и то же в этом случае.
На ваш первый вопрос вы в значительной степени прибили его по голове. [OptionalField]
в основном позволяет старым сериализациям быть совместимыми с новыми определениями. [NonSerialized]
означает, что вы не найдете его в сериализованных данных.
Учитывая различия, я не могу себе представить, почему вы поместили оба в одно поле, но я думаю, что компилятор будет жаловаться.