将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
成为更通用的类型(例如Map
或Map
)。