Pregunta

Encontré esta pregunta en Transcender:

¿Qué debe aplicar a un campo si no se requiere su valor durante la deserialización?

Me = [noerializado], respuesta = [OpcionalField

Mi reacción intestinal no fue esterializada, pero el trascender dice que estoy equivocado. Tengo una buena idea de qué vigilar en lo que respecta al atributo [no unseralizado], pero aún así me gustaría que esto se aclarara.

Por lo que puedo decir, el primero tiene una relación con los conflictos de versiones entre versiones más nuevas y anteriores de la misma asamblea. Este último está más preocupado por no serializar un campo completo. ¿Hay algo más que pueda distinguir a estos dos? MSDN realmente no dice mucho sobre esto, ya que ambos se usan en BinaryFormatters y SoapFormatter con el XMLFormatter utilizando el XMLignoreAtTribute.

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

Simplemente lanzando este por ahí, pero ¿mi respuesta tiene algo que ver con la forma en que se implementa [OnDeserialized] y la interfaz IDeserilizationCallback?

ACTUALIZAR:

Sé que el atributo de campo opcional no serializa el valor que posee un miembro de datos, pero no eserializado ni siquiera serializará el miembro de los datos o su valor.

¿Fue útil?

Solución

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

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

Cuando usas [OptionalField], por otro lado, todavía vas a serializar el campo. Sin embargo, si el campo es perdido a tiempo de lectura (Cuando la corriente está deserializada en un objeto), entonces no se planteará 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 más antiguas del objeto (que faltan ese campo) se deserializarán normalmente.

Otros consejos

Solo jugando con el idioma inglés, no requerido y opcional significa lo mismo en este caso.

Para tu primera pregunta, la clavaste en la cabeza. [OptionalField] Básicamente permite que las serializaciones más antiguas sean compatibles con las definiciones más nuevas. [NonSerialized] significa que no lo encontrará en los datos serializados.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top