Aunque sorprendentemente la interfaz java.io.Serializable public interface Serializable{}
no contiene ningún método y campo en Java, la clase que implementa esta interfaz puede lograr la función de serialización y deserialización (el estado del objeto que se está serializando o deserializando) . ¿Cómo puede lograr la función de serialización y deserialización sin ningún método o campo en Java?Aunque la interfaz Serializable en Java no tiene métodos, ni campos, puede lograr su función. ¿Cómo?
Aunque la interfaz Serializable en Java no tiene métodos, ni campos, puede lograr su función. ¿Cómo?
Respuesta
Algunas interfaces solo sirven como "marcadores" o "banderas".
Se accede al UID y a lectores/escritores personalizados por reflexión.
Serializable
es un marcador, y el JRE/JVM puede tomar acción (es) en función de su presencia.
La interfaz Serializable es una interfaz de marcador que sólo notifica JVM que un objeto determinado se fija para ser serializado. El proceso de serialización ocurre internamente.
Serializable no contiene ningún método, que es el ObjectOutputStream
ObjectInputStream
y clases que pueden hacer que el trabajo, a través de los métodos writeObject
y readObject
.
Serializable
es solo una interfaz de marcador, en otras palabras, solo pone una bandera, sin requerir ningún campo o método.
Un diseño mejor hubiera sido
interface Serializable
void writeObject(ObjectOutputStream out)
void readObject(ObjectInputStream in)
El problema es que no hay manera de proporcionar implementaciones predeterminadas; entonces cada subclase debe implementar estos dos métodos, lo cual es una molestia.
class MyClass implements Serializable
// stupid boilerplate code
void writeObject(ObjectOutputStream out)
{
Util.defaultWriteObject(this, out);
}
En Java 8, esto va a cambiar, podemos tener impls por defecto de los métodos de interfaz
interface Serializable
void writeObject(ObjectOutputStream out) default Util::defaultWriteObject
void readObject(ObjectInputStream in) default Util::defaultReadObject
(Serializable
no cambiará, pero la nueva función se puede utilizar en casos comparables)
Estoy de acuerdo con irreputable, especialmente el aseveración implícita de que cada objeto debe saber cómo serializar/deserializar sí mismo, si él/ella afirmación de que:
no hay manera de proporcionar implementationsckquote predeterminado
Seguro que hay: Object Composition.
La serialización es una forma de guardar objetos y utilizamos la interfaz Serializable para lograr nuestro objetivo. La interfaz serializable es una interfaz de marcador. El patrón de interfaz de marcador es un patrón de diseño y proporciona información de tiempo de ejecución sobre objetos.
¿No es eso lo que todos dijeron hace seis años? –
Si ve la implementación de writeObject método de ObjectOutputStream, después de un fragmento de código verá dentro de la implementación.
Aquí se puede ver, si la clase no está implementando la interfaz Serializable, entonces NotSerializableException se lanza.
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
Serializable es sólo una interfaz de marcador. Java internamente use esto para comprobar que si el objeto es realmente escribible o no.
- 1. ¿Por qué Java.lang.Object no implementa la interfaz serializable?
- 2. métodos de interfaz no puede haber protegidas
- 3. En java, ¿es posible agregar la interfaz Serializable a la clase que no la tiene en tiempo de ejecución?
- 4. campos no permitidos en la interfaz C#
- 5. ¿Por qué SerializationInfo no tiene métodos TryGetValue?
- 6. ¿cómo funciona serializable en Java?
- 7. ¿Por qué Java Beans tiene que ser serializable?
- 8. Cómo lograr esta función en C/C++
- 9. ¿Cuándo deberíamos implementar la interfaz Serializable?
- 10. ¿Qué tan rápido es la creación de instancias de clase con métodos, pero no campos ni propiedades?
- 11. Serializar un objeto que tiene una clase primaria no serializable
- 12. métodos abstractos en una interfaz Java
- 13. ¿Por qué una clase interna serializable no es serializable?
- 14. Lograr multi-core en Java: ¿cómo?
- 15. ¿Cómo lograr que Java se refleje para detectar campos en la súper clase? no solo la clase real
- 16. Métodos sobrecargados en la interfaz
- 17. interfaz amplía otra interfaz, pero pone en práctica sus métodos
- 18. ¿Cómo escribir nuestra propia interfaz de marcador en Java?
- 19. Java: cómo manejar MUCHOS campos y su encapsulación limpiamente?
- 20. subclase de la clase Serializable padre que no serializable
- 21. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 22. La clase no se puede incrustar. Use la interfaz correspondiente en su lugar
- 23. ¿Cuál es la diferencia entre scala @Serializable y Java Serializable?
- 24. en Java, ¿cómo lograr escanear puertos UDP?
- 25. ¿Puede anular los escritores de flujo en objetos scala @serializable?
- 26. ¿Cómo envolver la clase en Java y guardar la interfaz?
- 27. gridview vacío aunque el sqldatasource tiene valores
- 28. Copie los campos de su clase principal en Java
- 29. ¿Cómo lograr que MATLAB reconozca los métodos estáticos recientemente agregados?
- 30. ¿Tiene acceso a los campos Java dinámicamente en Clojure?
puede implementar java.io.Externalizable para tener control sobre serialización y deserialización –