Cuando extiende una clase con excepción de clase (para crear una nueva excepción) recibe una advertencia para tener un serialVersionUID
. Sé que serialVersionUID
desempeña un papel importante durante la serialización y la deserialización, pero ¿cuándo se debe serializar mi excepción? ¿Puede alguien darme un caso práctico en el que quiero que mi clase de excepción personalizada tenga serialización y deserialización?¿Por qué mi clase de excepción debe ser serializada?
Respuesta
Esto se debe a que la clase raíz para todas las excepciones, Throwable
implementa la interfaz Serializable
. Todas las excepciones por defecto son serializables y esa es una decisión de diseño del lenguaje porque los autores querían que las excepciones se pudieran enviar a través del cable sin ninguna configuración especial.
Si la clase base no es serializable, tendría dificultades para transmitir qué fue exactamente lo que falló en caso de que fallara un método remoto ya que no tendría control sobre los tipos de excepción incorporados.
Si su excepción personalizada se usa alguna vez en una aplicación distribuida (utilizando RMI, Spring http-invocador, lo que sea) y se puede ejecutar desde un servidor invocado desde un cliente remoto, la excepción tendrá que ser serializada para cruzar el cable e ir al cliente.
Sus únicas opciones son definir serialVersionUID
para cada tipo Exception
que defina (el IDE puede generarlo) o suprimir la advertencia.
Puede encontrar mi pregunta anterior explicit serialVersionUID considered harmful? relevante.
- 1. clase inmutable debe ser definitiva?
- 2. ¿por qué el delegado debe ser estático?
- 3. ¿Por qué la clase Singleton debe sellarse?
- 4. Excepción de UIImagePickerController: "El tipo de fuente debe ser UIImagePickerControllerSourceTypeCamera"
- 5. ¿Por qué un método de interfaz C# implementado en una clase debe ser público?
- 6. La clase de contrato debe ser una clase abstracta
- 7. ¿Por qué obtengo el "error: ... debe ser un tipo de referencia" en mi método genérico C#?
- 8. ¿Por qué extender la clase de excepción?
- 9. java: ¿Por qué la variable local debe ser declarada definitiva
- 10. ¿Por qué el patrón del observador debe ser desaprobado?
- 11. ¿Por qué estoy recibiendo "debe ser atrapado o declarado arrojado" en mi programa?
- 12. ¿Por qué un método ClassInitialize debe ser estático?
- 13. Tabla hash: ¿por qué el tamaño debe ser primordial?
- 14. Haskell "donde" sangría: ¿por qué debe ser indentado pasado identificador?
- 15. Conectar por árbol anterior debe ser simétrico
- 16. ¿Por qué los campos de clase no pueden ser var?
- 17. ¿Debería mi clase de sesión ser estática?
- 18. Asp .Net MVC Viewmodel debe ser de clase o struct?
- 19. setProperty debe ser reemplazado por todas las subclases de SOAPMessage
- 20. ¿Por qué mi excepción de BlackBerry getMessage() devuelve nulo?
- 21. ¿Por qué la clase de identificación compuesta debe implementar Serializable?
- 22. Excepción no reportada java.sql.SQLException; debe ser atrapado o declarado para ser arrojado?
- 23. ¿Por qué mi clase no es aceptable?
- 24. Java- Uso de una constante en una clase abstracta que también debe ser utilizada por subclases
- 25. ¿Por qué DialogFragment no puede ser una clase interna?
- 26. ¿En qué casos la superclase no debe ser abstracta?
- 27. El atributo de anotación debe ser un literal de clase? ¿Por qué? Las constantes también deberían estar bien
- 28. NHibernate excepción: método Add debe ser 'público/virtuales protegidos' o 'interna protegida virtual'
- 29. ¿Por qué Visual Studio ha marcado mi clase como componente?
- 30. ¿Qué tan grande debe ser una imagen UIBarButtonItem?