将Java对象序列化为Java代码?

时间:2011-06-08 15:36:17

标签: java serialization code-generation

是否有将Java对象序列化为Java代码的实现?例如,如果我有对象

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

我可以使用

序列化
ObjectOutputStream out = new ObjectOutputStream( ... );
out.writeObject( m );
out.flush();

,例如,输出将是

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

你为什么要这样?有时以编程方式部分创建复杂对象更容易,然后在代码中手动完成创建。然后可以将此代码包含在源代码中,并使用其他所有内容控制版本。请注意,使用外部序列化对象是不可能的。

感谢您提供任何帮助。

5 个答案:

答案 0 :(得分:3)

我在一个新的github项目中实现了这个功能。你可以在这里找到这个项目:

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

除junit之外,项目没有任何外部依赖项。

目前它尚不支持序列化数组。然而,已经有很多功能:

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

答案 1 :(得分:1)

可以实现对象的自定义序列化。您必须在类中使用确切的签名实现两个方法:

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


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

然而,你所寻求的灵活性是非常值得怀疑的。

答案 2 :(得分:0)

您是否可以使用Clojure并将其与Java代码集成? Clojure是homoiconic - 它的数据与它的代码相同,所以你可以很容易地做这样的事情。

地图是Clojure中的基本数据类型。

答案 3 :(得分:0)

长期持久性的预发布(java.beans.Encoder和friends)同时具有XMLEncoder和Java编码器。你可能仍然可以在某处下载它。

答案 4 :(得分:0)

我最近遇到了类似的问题,小框架testrecorder从中发展而来。它还支持不符合Java Bean约定的对象。您的示例可以像这样序列化:

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

,输出为:

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

有人可以致电serialize(Type, Object)使map1成为更通用的类型(例如MapMap<String, Integer>)。