2010-04-07 17 views
13

Ya que puede convertir cualquier documento a una matriz de bytes y guardarlo en el disco, y luego reconstruir el archivo a su forma original (siempre y cuando tenga metadatos para su nombre de archivo, etc.).¿Por qué tiene que marcar una clase con el atributo [serializable]?

¿Por qué tiene que marcar una clase con [Serializable], etc.? ¿Es esa la misma idea, la información del tipo "metadatos", de modo que cuando se lanza el objeto a su clase, las cosas se asignan correctamente?

+0

Para completar, si está almacenando los datos (en el disco, etc.) ** no ** recomiendo 'BinaryFormatter' (que es el principal que se preocupa por esto). La mayoría de los otros serializadores harán el trabajo, pero sin morderlo cuando cambie los tipos. –

+0

Sin embargo, 'BinaryFormatter' es con mucho el más poderoso. Serializa campos y propiedades, serializa el objeto completo, incluidos los campos privados, y admite referencias cíclicas, además omite la construcción de objetos, por lo que no requiere un constructor predeterminado público, ninguno de los cuales, p. el 'XmlSerializer' proporciona. Si desea cambiar los tipos, tendrá que lidiar con el control de versiones. – mnemosyn

+0

Lo opuesto: [why-doesnt-the-xmlserializer-need-the-type-to-be-marked-serializable] (http://stackoverflow.com/questions/392431/why-doesnt-the-xmlserializer-need- the-type-to-be-marked-serializable) – nawfal

Respuesta

15

En primer lugar, usted no tiene a.

Es simplemente un marker interface que le dice al serializador que la clase se compone de elementos que puede serializar (lo que puede o no ser cierto) y que puede usar la serialización predeterminada.

El XMLSerializer tiene el requisito adicional de tener un constructor de parámetro cero para la clase.

Existen otros serializadores que usan contratos para la serialización (como el DataContractSerializer): le dan más control sobre la serialización que simplemente marcar una clase como Serializable. También puede obtener más control implementando la interfaz ISerializable.

+7

El XmlSerializer no requiere SerializableAttribute –

+0

@Oded: -1 hasta que edite su respuesta para mostrar que al 'XmlSerializer' no le importa' [Serializable] '. –

+1

@Matthew Whited, @John Saunders - gracias por la corrección. Respuesta actualizada – Oded

2

Indica al serializador que desea que se serialice esa clase, ya que es posible que no desee serializar todas las propiedades o clases.

+2

Solo se puede aplicar a tipos, no a miembros. –

+0

Woops, mi error - respuesta corregida – Chris

+1

Creo que esto es un poco engañoso - parece que si tengo una clase A serializable con un miembro B de un tipo no serializable entonces el miembro B será ignorado. De hecho, la serialización A arrojará. – EMP

2

Básicamente son metadatos que indican que una clase se puede serializar, nada más.

Lo requieren muchos serializadores de marcos, que se niegan a tratar con tipos que no tienen este atributo aplicado a ellos.

2

La serialización puede crear agujeros de seguridad y puede estar plagada de problemas de versiones. Además de eso, para algunas clases, la idea misma de la serialización es completamente absurda.

Para más detalles, ver las excelentes respuestas a Why Java needs Serializable interface?, especialmente this one, this one y this one. Explican que la serialización debería ser una característica en la que debe optar explícitamente.

Para un contrapunto, la respuesta aceptada a esa pregunta indica que las clases deberían ser serializables de manera predeterminada.

21

La serialización binaria es bastante potente, puede crear una instancia de una clase sin ejecutar el constructor y puede establecer campos en su clase que haya declarado privado. El código regular por supuesto no puede hacer esto. Al aplicar el atributo [Serializable], explícitamente le das luz verde para meterse con sus partes privadas. E implícitamente das ese permiso solo a la clase BinaryFormatter.

La serialización XML no necesita este tipo de autorización, solo serializa los miembros que son públicos.

DataContractSerializer también puede serializar miembros privados. Por lo tanto, necesita un permiso explícito de nuevo, ahora con el atributo [DataContract].

+16

+1 por jugar con sus partes privadas! –

+0

-1 hasta que se corrija la respuesta: contra la creencia popular, DataContractSerializer no lo obliga a marcar una clase [DataContract], es una elección. Cuando ningún atributo decora la clase, el serializador deducirá de forma predeterminada un contrato de todas las propiedades y campos públicos de lectura/escritura. Vea MSDN: http://msdn.microsoft.com/en-us/library/ms733127%28v=vs.110%29.aspx – tsemer

+2

La palabra "público" en esa oración parece desconcertarlo. –

0

Lo veo como un recordatorio de que permitiré que la clase se serialice. Entonces no serializas implícitamente algo que no deberías.

No lo sé, es intención de los diseñadores.

Por cierto, me encanta BinaryFormatter y lo uso tanto como puedo. Maneja la mayoría de las cosas automáticamente (como la reconstrucción de gráficos de objetos complejos con referencias recurrentes distribuidas en todo el gráfico).

+0

pero no puede interoperar con dominios .NET. – nawfal

Cuestiones relacionadas