Andrew Gilmartin
Andrew Gilmartin

Reputation: 1786

Serialize a Java object to Java code?

Is there an implementation that will serialize a Java object as Java code? For example, if I have the object

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

I could serialize this using

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

and the output would, for example, be

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

Why would you want this? Sometimes it is easier to partially create complex objects programmatically and then complete the creation manually in code. This code can then be included in the source and version controlled with everything else. Note that using external serialized objects is not exceptable.

Thanks for any help you can give.

Upvotes: 12

Views: 1907

Answers (5)

CoronA
CoronA

Reputation: 8085

I had a similar problem recently and the little framework testrecorder evolved from it. It does also support objects not complying to the Java Bean Conventions. Your example be serializable like this:

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

and the output would be:

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

One may call serialize(Type, Object) to make map1 a more generic Type (e.g. Map or Map<String, Integer>).

Upvotes: 0

user207421
user207421

Reputation: 310980

The pre-release of Long Term Persistence (java.beans.Encoder and friends) had both an XMLEncoder and a Java encoder. You can probably still download it somewhere.

Upvotes: 0

Manuel_B
Manuel_B

Reputation: 565

I implemented this functionality in a new github project. You can find the project here:

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

The project does not have any external dependencies except junit.

Currently it is not supporting arrays for serialization yet. Nevertheless there is already a lot of functionalities:

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

Upvotes: 4

Adrian Mouat
Adrian Mouat

Reputation: 46518

Could you use Clojure instead and integrate it with your Java code? Clojure is homoiconic - its data is identical to its code, so you can do things like this very easily.

Maps are a basic datatype in Clojure.

Upvotes: 0

Swaranga Sarma
Swaranga Sarma

Reputation: 13423

You can achieve custom serialization of your objects. You have to implement two methods in your class with the exact signature:

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


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

However the amount of flexibility that you are seeking is very doubtful.

Upvotes: 1

Related Questions