Al igual que dice el título, ¿hay alguna forma de comprobar si un objeto es serializable y, en caso negativo, hacerlo en tiempo de ejecución?¿Se puede hacer un objeto serializable en tiempo de ejecución?
Respuesta
Respuesta corta - no.
Respuesta más larga - sí, usando la manipulación de código byte, por ejemplo con asm. Pero realmente deberías considerar si esto es necesario. La serialización es un asunto serio (Effective Java tiene un capítulo entero sobre la serialización)
Por cierto, hay alternativas a la serialización binaria, que no requieren el objeto que implementa Serializble
(como se ha señalado por Jacob en los comentarios):
- XML -
java.beans.XMLEncoder.encode(..)
es la versión xml deObjectOutputStream
- JSON: frameworks como Jacskon, Gson le permiten serializar un objeto con una línea.
+1 para incluir advertencias apropiadas. – DJClayworth
Como otros han dicho ... respuesta corta es No.
Puede absolutamente agregar una interfaz a cualquier objeto viejo en tiempo de ejecución mediante el uso de objetos proxy como se describe en http://download.oracle.com/javase/6/docs/technotes/guides/reflection/proxy.html. Esto incluye java.io.Serializable también. Sin embargo, para que un objeto proxy sea útil, debe mantener una referencia interna al objeto original, que en su caso no implementa Serializable. La única forma en que su objeto proxy podría ser serializado es hacer que la referencia interna al objeto original sea un campo transitorio y eso no le haría mucho bien.
Además, después de examinar sus comentarios, parece que la serialización de Java definitivamente no es lo que quiere y realmente solo quiere serializar a algún formato de cadena. Otros han sugerido varias soluciones, pero IMO si desea la menor cantidad de alboroto, vaya con XStream: http://x-stream.github.io/tutorial.html.
Los proxies se crean por interfaz, no en una clase. – Bozho
@Bozho - esa parte se detalla en la documentación que he vinculado. Se requerirían algunos cambios en su base de código si él ya no está utilizando la interfaz para referencia polimórfica (sp?) A sus objetos. – whaley
Su objeto original sería un miembro de InvocationHandler, que también está serializado, que fallará. – Bozho
Whoa. ¿Por qué necesitarías que se revisara en tiempo de ejecución? ¿No es más fácil garantizarlo en tiempo de compilación? Usando un código como este.
public void someMethod(Serializable serializable){
}
O puede hacerlo más complejo.
public interface SerializableInterface implements Serializable{
// bla-bla
}
public void someMethod(SerializableInterface serializable){
}
Aparte de las buenas respuestas existentes, otra pregunta es si usted necesita específicamente Java serializable de marco específico, o simplemente necesita ser capaz de objetos serializador. Para las últimas hay muchas más opciones que la predeterminada de JDK; y para muchos casos de uso, las alternativas son mucho mejores que JDK.
Si no necesita específicamente JDK uno, usar la serialización basada en JSON o XML a menudo es una buena opción.
La razón por la que estoy mirando la serialización es para un proyecto Me gustaría convertir un objeto en una cadena (a través de una matriz de bytes) para el almacenamiento y la transmisión donde se requiere que sea una cadena debido a factores externos. He visto varios ejemplos de cómo usar la serialización para convertir a una secuencia de bytes para capturar el objeto como una cadena al final, pero no hay nada sobre qué hacer si el objeto no es serializable. Entiendo la necesidad de que ciertos objetos no se serialicen, pero en este caso sería algo a la discreción del desarrollador. –
Ok, entonces definitivamente NO quieres usar JDK Serializable. Yo recomendaría usar la serialización JSON (como Jackson, ver http://wiki.fasterxml.com/JacksonInFiveMinutes). El resultado es más legible y mucho menos frágil. El problema principal con Serializable es que el control de versiones es muy difícil, por lo que es un anti-patrón para persistir en los resultados (lea la explicación de Josh Bloch, por ejemplo). Tampoco es legible (a diferencia de xml o json). No hay nada de malo en serializar cosas per se, pero Serializable rara vez es correcto. – StaxMan
¿Comprobación en tiempo de ejecución? Por supuesto. "if (someObject instanceof Serializable) ...".
¿Desea cambiar la definición de un objeto en tiempo de ejecución? Rara vez hay una buena razón para querer hacer esto. Tal vez hay una manera de hacer esto con la reflexión, pero nunca tuve una razón para querer hacer tal cosa. ¿Qué está tratando de lograr?
Si alguien realmente realmente necesita manipular con bytecode en tiempo de ejecución.Con la biblioteca Javassist se puede hacer esto:
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("mypackage.MyClass");
cc.addInterface(pool.get("java.io.Serializable"))
- 1. ¿Cómo se define un objeto C# en tiempo de ejecución?
- 2. ¿Se puede forzar a un objeto java a implementar una interfaz en tiempo de ejecución?
- 3. Tamaño de un objeto en tiempo de ejecución
- 4. Agregar miembros a un objeto dinámico en tiempo de ejecución
- 5. ¿Cómo uso un objeto scala @serializable?
- 6. CSS: ¿Se puede hacer clic en un objeto oculto?
- 7. ¿Un objeto serializable siempre se serializa cuando se coloca en un paquete?
- 8. ¿Cómo se reemplaza un método de un objeto Moose en tiempo de ejecución?
- 9. Cómo hacer simplejson clase serializable
- 10. Por qué se requiere un atributo serializable para serializar un objeto
- 11. ¿Se puede agregar un directorio a la ruta de clase en tiempo de ejecución?
- 12. ¿Cómo hacer que los campos de un modelo de Django se calculen en tiempo de ejecución?
- 13. java.io.NotSerializableException mientras se escribe objeto Serializable en el almacenamiento externo?
- 14. búsqueda de un valor en un objeto en tiempo de ejecución [Inspección rápida mejora]
- 15. ¿Puede anular los escritores de flujo en objetos scala @serializable?
- 16. objeto no es JSON serializable
- 17. Buscar referencias al objeto en tiempo de ejecución
- 18. ¿Se puede cambiar un mensaje de anotación en tiempo de ejecución?
- 19. ¿Puede el objetivo C determinar la referencia del objeto llamante en el tiempo de ejecución (reflexión)?
- 20. Persistir en un objeto que no está marcado como serializable
- 21. ¿Cómo se genera un número aleatorio en tiempo de ejecución?
- 22. Crear una instancia de un objeto con un tipo determinado en el tiempo de ejecución
- 23. No se puede asignar un objeto a un objeto volátil
- 24. Cómo comprobar si un objeto es serializable en C#
- 25. no se puede editar NSTextField en la hoja en tiempo de ejecución
- 26. ¿Se puede hacer un compilador incremental constante?
- 27. Haciendo un JButton se puede hacer clic en un JTable
- 28. La determinación de la jerarquía de clases de un objeto en el tiempo de ejecución
- 29. C#: ¿Método para devolver el objeto cuyo tipo concreto se determina en tiempo de ejecución?
- 30. parcelable encontró IOException escribiendo objeto serializable
Si el objeto no es serializable, puede ser que sea por una buena razón: por ejemplo, no tiene mucho sentido para serializar conexión de base de datos. –
¿Funcionaría un formato de serialización que no es Serialización de objetos Java? Estoy pensando en una solución que utiliza la reflexión y JSON o XML para serializar el objeto. Según otros comentarios, parece que su requisito es convertir el objeto en una Cadena y esto lo lograría. –
Esta pregunta es muy amplia, en gran parte porque no menciona todas sus limitaciones de diseño. (Por ejemplo, que necesita un formato de serialización de cadenas). – jpaugh