2010-09-07 9 views
7

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?

+0

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. –

+1

¿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. –

+0

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

Respuesta

11

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 de ObjectOutputStream
  • JSON: frameworks como Jacskon, Gson le permiten serializar un objeto con una línea.
+0

+1 para incluir advertencias apropiadas. – DJClayworth

1

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.

+0

Los proxies se crean por interfaz, no en una clase. – Bozho

+0

@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

+1

Su objeto original sería un miembro de InvocationHandler, que también está serializado, que fallará. – Bozho

0

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){ 
} 
0

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.

+0

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. –

+0

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

0

¿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?

0

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")) 
Cuestiones relacionadas