read property only jsonview jsoninclude jsonignore jsonfilter java serialization code-generation

property - ¿Serializar un objeto Java a código Java?



jsonfilter (5)

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

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

Podría serializar esto usando

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

y la salida sería, por ejemplo,

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

Por qué querrías 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 usted puede dar.


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


Puede lograr la serialización personalizada de sus objetos. Tienes que implementar dos métodos en tu 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 está buscando es muy dudosa.


El prelanzamiento de Long Term Persistence (java.beans.Encoder y sus amigos) tenía un XMLEncoder y un codificador Java. Probablemente aún puedas descargarlo en algún lado.


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

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

El proyecto no tiene dependencias externas excepto junit.

Actualmente, aún no admite matrices para la serialización. Sin embargo, ya hay muchas funcionalidades:

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


Recientemente tuve un problema similar y la pequeña grabadora de pruebas marco evolucionó a partir de él. También admite objetos que no cumplen con las Convenciones de Java Bean. Tu ejemplo puede ser serializable así:

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 el resultado sería:

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

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