2010-04-06 47 views
6

[OptionalField] y [NonSerialized] me encontré con esta pregunta en transcender:¿Cuál es la diferencia entre el

Lo que debe aplicarse a un campo si no se requiere su valor durante la deserialización?

Me = [NonSerialized], RESPUESTA =

Mi reacción [OptionalField] intestino fue NonSerialised pero Transcender dice que estoy equivocado. Tengo una buena idea de qué buscar en lo que se refiere al atributo [Nonseralized], pero aún así me gustaría que quede aclarado.

Por lo que puedo decir, el primero tiene una relación con conflictos de versiones entre versiones más nuevas y más antiguas del mismo ensamblaje. Este último está más preocupado por no serializar un campo FULLSTOP. ¿Hay algo más que pueda separar estos dos? MSDN realmente no dice mucho sobre esto ya que ambos se usan en BinaryFormatters y SoapFormatter con XMLFormatter usando XMLIgnoreAttribute.

Mi segunda pregunta es ¿puedes mezclar y combinar cualquiera de los dos atributos? Todavía tengo que usarlos.

Solo lanzando esta, ¿pero tiene algo que ver mi respuesta con la forma en que se implementa [OnDeserialized] y la interfaz IdeserilizationCallback?

ACTUALIZACIÓN:

Sé que atributo de campo opcional no serializa el valor en poder de un miembro de datos, sino que ni siquiera se NonSerialized serialized miembro de datos o su valor.

+0

Para completar: para cualquier cosa que implique almacenamiento (es decir, donde el control de versiones se convierte en un problema), 'BinaryFormatter' puede no ser una buena opción.Veo * muchas * personas con problemas al ir por esta ruta. –

+0

Gracias Marc, estoy al tanto de este problema, pero solo necesito obtener una buena comprensión de estos dos atributos en lo que respecta al examen 70-536. – IbrarMumtaz

Respuesta

6

Estos dos atributos se usan para lados opuestos de la ecuación de serialización.

Cuando usa [NonSerialized], está diciendo "este campo no se debe serializar en absoluto", por lo que es más un atributo de "tiempo de guardado". Básicamente, estás diciendo que el campo no importa para el estado serializado del objeto.

Por otro lado, cuando usa [OptionalField], todavía va a serializar el campo. Sin embargo, si el campo es falta en tiempo de lectura (cuando la secuencia se deserializa en un objeto), no se generará ninguna excepción. Este atributo está realmente destinado a permitirle agregar un nuevo campo a un tipo serializable existente, sin romper la compatibilidad. Las versiones anteriores del objeto (que faltan en ese campo) se deserializarán normalmente.

+0

gracias, eso es lo que tenía en mente, simplemente creo que podría haber algo más que me podría estar perdiendo .......) – IbrarMumtaz

+0

@IbrarMumtaz: No, la diferencia está en tu intento. [OptionalField] aún sugiere que el campo tiene un efecto en el estado, pero [NotSerialized] realmente significa que el campo es algo que simplemente no debería estar allí, sin importar qué ... –

+0

'[NonSerialized]' puede incluso querer decir "esto campo se refiere a un objeto que no se puede serializar, por lo que obtendríamos una excepción si intentáramos serializarlo ". –

1

Sólo jugando fuera el idioma Inglés, no se requiere y opcional significan lo mismo en este caso.

Para su primera pregunta, casi se lo clavó en la cabeza. [OptionalField] básicamente permite que las serializaciones antiguas sean compatibles con las definiciones más recientes. [NonSerialized] significa que no lo encontrará en los datos serializados.

Dadas las diferencias, no puedo imaginar por qué pondría ambos en un solo campo, pero supongo que el compilador se quejaría.

+0

El compilador no daría dos ululatos. Puede que el * runtime * no le agrade (no lo he intentado). –

+0

Nunca usarías ambas, solo una u otra, ¿cuál es la pregunta? – IbrarMumtaz

Cuestiones relacionadas