2011-06-08 17 views
10

¿Hay alguna implementación que serialice un objeto Java como código Java? Por ejemplo, si tengo el objetoSerializar un objeto Java a código Java?

Map<String,Integer> m = new Map<String,Integer>(); 
m.put("foo",new Integer(21)); 

que podría serializar esto utilizando

ObjectOutputStream out = new ObjectOutputStream(...); 
out.writeObject(m); 
out.flush(); 

y la salida sería, por ejemplo, ser

java.util.Map<String,Integer> m = new java.util.Map<String,Integer>(); 
m.put("foo",new Integer(21)); 

¿Por qué quieres esto? A veces es más fácil crear objetos complejos de forma programática y luego completar la creación manualmente en el código. Este código se puede incluir en la fuente y la versión controlada con todo lo demás. Tenga en cuenta que el uso de objetos serializados externos no es excepcional.

Gracias por cualquier ayuda que pueda dar.

+2

No creo que haya ninguna forma (estándar) de hacer esto –

+1

(+1) para "¿Por qué quieres esto?", Muchas preguntas quieren algo inusual, pero no explica por qué. Y hay una gran cantidad de generación de códigos de auto, cuando se genera el material principal, y solo unos pocos detalles se codifican a mano ... – umlcat

+1

Otra alternativa sería la generación de código estático (por una entidad externa), por lo que no tiene que hacerlo a mano. El beneficio de esto es que no tiene que gastar ciclos de CPU deserializándolo. – mindas

Respuesta

1

Usted puede lograr la serialización personalizada de sus objetos. Usted tiene que aplicar dos métodos en su clase con la firma exacta:

private void writeObject(ObjectOutputStream oos) 
{ 
    //write your serialization code here 
} 


private void readObject(ObjectInputStream ois) 
{ 
    //write your de-serialization code here 
} 

Sin embargo, la cantidad de flexibilidad que usted está buscando es muy dudoso.

+0

Aún recibirá un encabezado de flujo de objetos. – EJP

0

¿Podría usar Clojure e integrarlo con su código Java? Clojure es homoicónico: sus datos son idénticos a su código, por lo que puede hacer cosas como esta muy fácilmente.

Los mapas son un tipo de datos básico en Clojure.

3

Implementé esta funcionalidad en un nuevo proyecto github. Puede encontrar el proyecto aquí:

https://github.com/ManuelB/java-bean-to-code-serializer

El proyecto no tiene ningún dependencias externas, excepto JUnit.

Actualmente, aún no admite matrices para la serialización. Sin embargo ya hay una gran cantidad de funcionalidades:

 Object2CodeObjectOutputStream object2CodeObjectOutputStream = new Object2CodeObjectOutputStream(
      byteArrayOutputStream); 
     object2CodeObjectOutputStream.writeObject(<your-java-bean>); 
     System.out.println(
       byteArrayOutputStream.toString()); 
0

El pre-lanzamiento de la persistencia a largo plazo (java.beans.Encoder y amigos) tenían tanto un XMLEncoder y un codificador de Java. Probablemente aún puedas descargarlo en algún lado.

0

Tuve un problema similar recientemente y el pequeño framework testrecorder evolucionó a partir de él. También admite objetos que no cumplen con las Convenciones de Java Bean. Tu ejemplo sea serializable como esto:

Map<String,Integer> m = new HashMap<String,Integer>(); 
m.put("bar",new Integer(21)); 

CodeSerializer codeSerializer = new CodeSerializer(); 
System.out.println(codeSerializer.serialize(m)); // of course you can put this string to a file output stream 

y la salida sería:

HashMap map1 = new LinkedHashMap<>(); 
map1.put("foo", 21); 

Uno puede llamar para hacer serialize(Type, Object)map1 un tipo más genérico (por ejemplo Map o Map<String, Integer>).