serialize mvc jsonview jsonsubtypes jsoncreator example spring-mvc serialization jackson

spring-mvc - jsonview - jackson spring mvc



Spring MVC: ¿deberían mis clases de dominio implementar Serializable para transferencia por cable? (4)

Hay muchas formas de serializar un objeto. La serialización de objetos de Java es solo uno de ellos. De la documentación oficial :

Serializar un objeto significa convertir su estado en un flujo de bytes

Las API de REST generalmente envían y reciben JSON o XML. En ese caso, serializar un objeto significa convertir su estado en una String .

No hay una conexión directa entre "enviar un objeto por cable" e implementar Serializable . Las tecnologías que utilice determinan si se debe implementar Serializable o no.

Estoy intentando aprender Spring Boot implementando una API REST simple.

Mi entendimiento fue que si necesito transferir un objeto a través del cable, ese objeto debería implementar Serializable.

Sin embargo, en muchos ejemplos en la red, incluidos los oficiales, las clases de dominio que deben transferirse de un servidor a otro (o viceversa) no tienen que implementar Serializable.

Por ejemplo: https://spring.io/guides/gs/rest-service/

Pero en algunos casos, lo hacen:

Por ejemplo: https://github.com/szerhusenBC/jwt-spring-security-demo/blob/master/src/main/java/org/zerhusen/security/JwtAuthenticationRequest.java

¿Hay una regla general para decidir cuándo implementar Serializable?


Los ejemplos específicos que ha mencionado no transfieren objetos a través del cable. De los enlaces de ejemplo, veo que los métodos del controlador devuelven un objeto de dominio con la anotación ResponseBody . Debido a que el tipo de retorno del método es el objeto de dominio, no es necesario que todo el objeto se envíe al cliente. Uno de los métodos del controlador en Spring mvc framework intercepta internamente la invocación y determina que el tipo de retorno del método no se traduce en el objeto ModelAndView directo. RequestResponseBoodyMethodProcessor que maneja el valor de retorno de dichos métodos anotados y usa uno de los convertidores de mensajes para escribir el objeto de devolución en el cuerpo de respuesta http. En el caso de que el convertidor de mensajes utilizado sea MappingJackson2HttpMessageConverter . Entonces, si van a seguir el mismo estilo de codificación, no es necesario que implemente Serializable para sus objetos de dominio.

Eche un vistazo a este link para los convertidores de mensajes HTTP proporcionados de forma predeterminada desde Spring. La lista es bastante extensa, pero no es exhaustiva y, si surgen requisitos, puede implementar su propio convertidor de mensajes personalizado para el usuario también.


Para actualizar esto, el consejo sobre Serializable ha cambiado, la recomendación actualmente parece ser No usar Serializable para nada .

El uso de la API de serialización de Java significa que necesita algo en Java en el otro lado del cable para deserializar los objetos, por lo que debe controlar el código que se deserializa y el código que serializa.

Por lo general, esto no es relevante para las aplicaciones REST, ya que consumir la respuesta de la aplicación es asunto del código de otra persona, generalmente fuera de su organización. Al crear una aplicación REST, es normal tratar de evitar imponer limitaciones a lo que la consume, eligiendo un formato que sea más independiente de la tecnología y esté disponible.

Algunas razones para hacer un objeto serializable serían:

  • para que puedas ponerlo en una HttpSession

  • para que pueda pasarlo entre niveles en una aplicación distribuida

  • para que pueda guardarlo en el sistema de archivos y restaurarlo más tarde (por ejemplo, puede hacer que el contenido de una cola se pueda serializar y guardar el contenido de la cola cuando la aplicación se apaga, leyendo desde la ubicación de guardado cuando la aplicación comienza a restaurar el archivo). hacer cola a su estado de apagado).

En todos estos casos, serializa para poder guardar algo en un sistema de archivos o enviarlo a través de una red.


esa es una buena pregunta cuando implementar la interfaz Serializable.

Estos enlaces pueden proporcionar algunos contenidos útiles:

Serialización de la instancia java.io.Serializable en JSON con Spring y Jackson JSON

¿Cuándo y por qué las entidades JPA deberían implementar la interfaz Serializable?

A veces me pregunto sobre esto, y pienso.

Debido a que Java es un lenguaje de código abierto, y hay más bibliotecas suministradas por terceros. Para saber quién serializará y deserializará el objeto, el oficial Java declara una interfaz de resumen, hace que la transferencia sea fácil y segura a través de diferentes bibliotecas.

Es solo un resumen, la mayoría de las bibliotecas de terceros pueden serializar / deserializar cuando se verifica la implementación de este constract. Y la biblioteca de Jackson no lo usa.

Por lo tanto, puede considerar si utiliza serializar / deserializar datos de objetos en su propio sistema, y ​​un proceso simple, como simplemente serializar y responder (jackson en Spring MVC), no necesita implementarlo. pero si usó en otra biblioteca jar, le gusta guardar en HttpSession, u otros componentes / biblioteca de terceros, debería (o debe) implementar Serializable, de lo contrario, las bibliotecas lanzarán una excepción para decirle la interfaz que se sabe que es no proporcionar

Pero dijeron que es un buen hábito y mejores propiedades que implementar el Serializable cuando se serializa una clase personalizada. :)