java - serializar - serialización en netbeans
Java: ¿Qué puede y qué no puede ser serializado? (9)
Si la interfaz Serializable
es solo una Marker-Interface que se usa para pasar algún tipo de metadatos sobre clases en Java, estoy un poco confundido:
Después de leer el proceso del algoritmo de serialización de Java (metadatos de arriba abajo, luego datos de instancia reales de arriba a abajo), realmente no puedo entender qué datos no pueden procesarse a través de ese algoritmo.
En definitiva y formal:
- ¿Qué datos pueden causar la
NotSerializableException
? - ¿Cómo debo saber que no debo agregar las cláusulas
implements Serializable
losimplements Serializable
para mi clase?
¿Qué datos pueden causar la excepción NotSerializableException?
En Java, serializamos el objeto (la instancia de una clase Java que ya implementó la interfaz Serializable ). Así que está muy claro que si una clase no ha implementado la interfaz Serializable , no puede ser serializada (en ese caso se lanzará NotSerializableException ).
La interfaz Serializable es simplemente una interfaz de marcador , de manera que podemos decir que es solo un sello en una clase y eso solo le dice a JVM que la clase puede ser serializada.
¿Cómo debo saber que no debo agregar las cláusulas serializables de los implementos para mi clase?
Todo depende de tu necesidad.
Si desea almacenar el Objeto en una base de datos, puede serializarlo a una secuencia de bytes y puede almacenarlo en la base de datos como datos persistentes.
Puede serializar su objeto para que lo utilicen otras JVM que trabajan en máquinas diferentes.
Después de leer el proceso del algoritmo de serialización de Java (metadatos de arriba abajo, luego datos de instancia reales de arriba a abajo), realmente no puedo entender qué datos no pueden procesarse a través de ese algoritmo.
La respuesta a esto es ciertas clases de nivel de sistema como Thread, OutputStream y sus subclases que no son serializables. Explicado muy bien en los documentos de Oracle: http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html
A continuación se muestra el resumen:
Por otro lado, ciertas clases de nivel de sistema como Thread, OutputStream y sus subclases, y Socket no son serializables. De hecho, no tendría ningún sentido si lo fueran. Por ejemplo, un hilo que se ejecuta en mi JVM estaría usando la memoria de mi sistema. Persistirlo y tratar de ejecutarlo en su JVM no tendría ningún sentido.
Cualquier cosa que su clase Serializable
tenga en ella que no sea Serializable
arrojará esta excepción. Puedes evitarlo usando la palabra clave transient
.
Los ejemplos comunes de cosas que no puede serializar incluyen componentes Swing y subprocesos. Si lo piensas, tiene sentido porque nunca podrías deserializarlos y tenerlo.
Cuando se habla de NotSerializableException
, se lanza cuando se desea serializar un objeto, que no se ha marcado como Serializable
. Serializable
es todo, aunque cuando se extiende la clase no serializable y se agrega una interfaz Serializable
, está perfectamente bien.
No hay datos que no puedan ser serializados.
En primer lugar, si no planea nunca serializar una instancia de su clase, no hay necesidad de pensar siquiera en serializarla. Solo implemente lo que necesita, y no intente que su clase sea serializable por el simple hecho de hacerlo.
Si su objeto tiene una referencia (transitiva o directa) a cualquier objeto no serializable, y esta referencia no está marcada con la palabra clave transient
, entonces su objeto no será serializable.
En general, no tiene sentido serializar objetos que no se pueden reutilizar cuando se deserializa más tarde o en otro lugar. Esto podría deberse a que el estado del objeto solo es significativo aquí y ahora (si tiene una referencia a un subproceso en ejecución, por ejemplo), o porque usa algún recurso como un socket, una conexión de base de datos o algo así. Una gran cantidad de objetos no representan datos, y no deberían ser serializables.
Más prácticamente, ningún objeto puede ser serializado (a través del mecanismo incorporado de Java) a menos que su clase implemente la interfaz Serializable. Sin embargo, ser una instancia de tal clase no es una condición suficiente: para que un objeto se serialice correctamente, también debe ser cierto que todas las referencias no transitorias que contiene deben ser nulas o referirse a objetos serializables. (Tenga en cuenta que esa es una condición recursiva). Los valores primitivos, los valores nulos y las variables transitorias no son un problema. Las variables estáticas no pertenecen a objetos individuales, por lo que tampoco presentan un problema.
Algunas clases comunes son confiablemente seguras para la serialización. Las cadenas son probablemente las más notables aquí, pero todas las clases de envoltorio para tipos primitivos también son seguras. Las matrices de primitivas son serializables de manera confiable. Las matrices de tipos de referencia se pueden serializar si todos sus elementos se pueden serializar.
Necesitas manejar la serialización de tus propios Objetos.
Java manejará los tipos de datos primitivos por ti.
Más información: http://www.tutorialspoint.com/java/java_serialization.htm
Todos los tipos de datos primitivos y las clases se extienden directamente a Serializable ,
class MyClass extends Serializable{
}
o indirectamente,
class MyClass extends SomeClass{
}
SomeClass implementa Serializable.
puede ser serializado. Todos los campos de una clase serializable se serializan, excepto los campos que están marcados como transient
. Si una clase serializable contiene un campo que no es serializable (no es primitivo y no se extiende desde la interfaz serializable), se NotSerializableException
.
Responda a la segunda pregunta: Como dijo @JB Nizet. Si va a escribir la instancia de una clase en algún flujo, entonces solo marque como Serializable, de lo contrario nunca marque una clase Serializable.
NotSerialisable
excepción NotSerialisable
se lanza cuando algo en su serializable está marcado como serializable. Uno de estos casos puede ser:
class Super{}
class Sub implements Serializable
{
Super super;
Aquí el super no se menciona como serializable por lo que lanzará NotSerializableException
.