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

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

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

我可以使用它来序列化

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

例如,输出就是

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

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

谢谢你提供的所有帮助。

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

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

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

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

  Object2CodeObjectOutputStream object2CodeObjectOutputStream = new Object2CodeObjectOutputStream( byteArrayOutputStream); object2CodeObjectOutputStream.writeObject(); System.out.println( byteArrayOutputStream.toString()); 

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

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

然而,您正在寻求的灵活性是非常值得怀疑的。

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

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

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

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

 Map m = new HashMap(); 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 )。