No he intentado esto todavía, pero parece arriesgado. El caso en el que estoy pensando es instrumentar clases simples de VO con JiBX. Estos VO se serializarán en AMF y posiblemente en otros esquemas. ¿Puede alguien confirmar o negar mis sospechas de que hacer cosas secundarias como la mejora del código de bytes podría estropear algo en general, y proporcionar información básica sobre por qué? Además, estoy interesado en el caso específico de JiBX.¿Es seguro usar técnicas de mejora de bytecode en las clases que se pueden serializar y por qué?
Respuesta
Detrás de escena, la serialización usa la reflexión. La manipulación de su bytecode presumiblemente agrega campos. Entonces, a menos que marques estos campos como transitorios, se serializarán como campos normales.
Por lo tanto, siempre que haya realizado la misma manipulación de bytecode en ambos lados, todo irá bien.
Si no lo hizo, deberá leer la documentación de serialización para comprender cómo funcionan las funciones de compatibilidad con versiones anteriores. Básicamente, creo que puede enviar campos que el receptor no espera y está bien; y puede perder campos y obtendrán sus valores predeterminados en el extremo receptor. ¡Pero debe comprobar esto en la especificación!
Si solo está agregando métodos, entonces no tienen ningún efecto en la serialización, a menos que sean cosas como readResolve()
, etc. que son específicamente utilizados por el mecanismo de serialización.
Añadir/cambiar/eliminar campos o métodos públicos o protegidos a una clase afectará su capacidad de deserialización. Al igual que agregar interfaces. Estos se utilizan, entre otras cosas, para generar un serialVersionUID que se escribe en la secuencia como parte del proceso de serialización. Si el serialVersionUID
de la clase no coincide con la clase cargada durante la deserialización, fallará.
Si configura explícitamente el serialVersionUID
en su definición de clase, puede hacerlo. Es posible que desee implementar readObject
y writeObject
también.
En el caso extremo, puede implementar Externalizable y tener control total de toda la serialización del objeto.
El peor de los escenarios (aunque es increíblemente útil en algunas situaciones) es implementar writeReplace
en un objeto complejo para cambiarlo por una especie de objeto de valor más simple en la serialización. Luego, en la deserialización, el objeto de valor más simple puede implementar readResolve
para reconstruir o ubicar el objeto complejo en el otro lado. Es raro cuando necesitas sacarlo, pero terriblemente divertido cuando lo haces.
+1 para 'serialVersionUID'. Me olvide de eso. Si no proporciona uno, se calcula en tiempo de ejecución, lo que podría afectar la capacidad de mover objetos. – dty
- 1. ¿Por qué no se pueden serializar objetos y clases de casos?
- 2. ¿Qué técnicas se pueden usar para hacer las pruebas de escritura más interesantes?
- 3. ¿Qué técnicas de lenguaje funcional se pueden usar en idiomas imperativos?
- 4. ¿Por qué las clases internas no pueden declarar miembros estáticos?
- 5. ¿Por qué no serializar clases abstractas en Java?
- 6. ¿Por qué las clases estáticas solo pueden tener miembros estáticos?
- 7. ¿Qué tan seguro es usar document.body.innerHTML.replace?
- 8. ¿Qué clases y funciones de C# se pueden usar en la afeitadora?
- 9. ¿Qué es la mejora progresiva?
- 10. Singleton - ¿Por qué usar clases?
- 11. ¿Por qué los oyentes del ciclo de vida se pueden serializar en Hibernate?
- 12. ¿Es seguro serializar una variante raw boost ::?
- 13. ¿Qué clases no se pueden subclasificar?
- 14. ¿Por qué ConcurrentHashMap.putifAbsent es seguro?
- 15. ¿Qué tan seguro es usar Maven?
- 16. ¿Se pueden usar los rasgos en D para las clases de tipo?
- 17. ¿Por qué los eventos no se pueden usar de la misma manera en las clases derivadas que en la clase base en C#?
- 18. C++: ¿es seguro usar longjmp y setjmp?
- 19. ¿Por qué no se puede serializar todo tipo de objeto?
- 20. ¿Por qué las clases estáticas no pueden tener métodos y variables no estáticos?
- 21. ¿Por qué java.lang.Void no se puede serializar?
- 22. ¿Por qué las interfaces de usuario de redes son tan técnicas y poco intuitivas?
- 23. Restringir las clases que pueden implementar una interfaz
- 24. ¿Qué técnicas genéricas se pueden aplicar para optimizar las consultas SQL?
- 25. ¿Por qué se incluye Indy 9 con Delphi 2009? ¿Es seguro de usar?
- 26. ¿Por qué usar set_include_path() en PHP y cómo cargar automáticamente las clases desde diferentes carpetas?
- 27. ¿Por qué `vapply` es más seguro que` sapply`?
- 28. ¿Es seguro usar window.screen?
- 29. ¿Por qué las DLL de Delphi pueden usar WideString sin usar ShareMem?
- 30. ¿Por qué Android prefiere las clases estáticas
+1 para señalar el enfoque KISS de simplemente mejorar en ambos lados. Definitivamente lo probaría primero. –