No lo necesitamos si estamos implementando Serializable. Entonces, ¿por qué esta diferencia? ¿Cómo se relaciona con el mecanismo real de Serialización?¿Por qué la implementación de Externalizable necesita un constructor público predeterminado?
Respuesta
Una explicación detallada (aunque la gramática del artículo podría mejorarse) se puede encontrar en http://www.jusfortechies.com/java/core-java/externalization.php. La respuesta corta, para referencia futura en caso de que la página vinculada desaparezca:
Externalizable es una interfaz que se extiende Serializable. Contrariamente a Serializable, sin embargo, los objetos no se restauran simplemente leyendo la corriente de bits serializada, sino que se llama al constructor público y solo una vez que se crea el objeto, se restablece su estado. Esto hace que la restauración sea más eficiente.
Editar: Véase también What is the difference between Serializable and Externalizable in Java?.
Esto se utiliza principalmente para el almacenamiento en caché. Con el fin de deserializar través de corrientes, que tendrá que explicar cómo quiere que su objeto sea deserializado, por lo tanto, los dos métodos proporcionados por el contrato en Externalizable
interfaz: writeExternal
y readExternal
. Tenga en cuenta que Externalizable
se extiende a Serializable
, por lo que no es necesario implementar la interfaz Serializable
(aunque es una interfaz de marcador y no hay métodos para implementar realmente). Para obtener una implementación de muestra, consulte MimeType.
Se necesita un constructor público no-arg al usar la interfaz Externalizable.
Debido a que en caso de Serializable
- readObject lee la información requerida del ObjectInputStream
- serialización utiliza el mecanismo de reflexión para obtener los campos necesarios y sus valores correspondientes.
- Serializable serializa todos los miembros de datos (excepto estáticos y transitorios).
Pero en caso de Externalizable
- No existe ningún mecanismo de reflexión utilizado.
- El usuario no serializa todos los miembros de datos. Por eso, para obtener valores de los miembros que no se han publicitado públicamente, no se requiere ningún constructor de argumentos.
- 1. ¿Para qué JAXB necesita un constructor público no-arg?
- 2. MVVM: ¿Realmente la vista necesita tener un constructor predeterminado?
- 3. ¿Por qué JAXB necesita un constructor no arg para ordenar?
- 4. ¿Por qué mi subclase de C++ necesita un constructor explícito?
- 5. ¿Por qué una clase utilizada como valor en un mapa STL necesita un constructor predeterminado en ...?
- 6. ¿Por qué el constructor EnumMap necesita un argumento de clase?
- 7. ¿Por qué PHP no tiene un constructor predeterminado?
- 8. ¿Por qué el constructor de java.io.FileDescriptor es público?
- 9. constructor público y constructor estático
- 10. ¿Por qué las instancias std :: function tienen un constructor predeterminado?
- 11. Por qué el compilador proporciona el constructor de copia predeterminado
- 12. ¿Cuándo necesita llamar explícitamente a un constructor de superclase?
- 13. ¿Por qué se llama al constructor predeterminado en herencia virtual?
- 14. Copy Constructor y constructor predeterminado
- 15. Por qué InitializeComponent es público
- 16. Por qué la clase XML-Serializable necesita un constructor sin parámetros
- 17. Acceso público predeterminado en scala
- 18. ¿Por qué necesita PrintWriter?
- 19. ¿Por qué el constructor de copias oculta el constructor predeterminado en C++?
- 20. ¿Por qué se requiere un constructor predeterminado para los objetos exportados por una JAX-WS?
- 21. ¿por qué el asignador en C++ necesita un constructor de copia?
- 22. ¿Cómo definir un constructor predeterminado por código usando StructureMap?
- 23. ¿Por qué removeChild necesita un nodo principal?
- 24. ¿Por qué una implementación de propiedad de dependencia bloqueará mi aplicación cuando proporcione un valor predeterminado?
- 25. ¿Por qué la web necesita HTTP?
- 26. ¿Deberíamos siempre incluir un constructor predeterminado en la clase?
- 27. ¿Por qué RoleVoter de Spring Security necesita un prefijo?
- 28. ¿Es un constructor público en una clase abstracta un código?
- 29. Mensajes personalizados en clases sin ventana: ¿necesita un controlador predeterminado?
- 30. ningún constructor predeterminado adecuado disponible
¿De qué constructor público está hablando, dado que esta es una interfaz? ¿O te refieres al artículo vinculado? –
Me refiero al mismo constructor sobre el que se trata la pregunta, concretamente el de la clase implementadora. – jstarek
Ah, lo leí mal. ¡Gracias! Su respuesta sería más acertada si menciona que llama a los métodos de implementación directamente en el constructor. Dicho eso, tu respuesta es mejor que la mía. :) –