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