是否有将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));
你为什么要这样?有时以编程方式部分创建复杂对象更容易,然后在代码中手动完成创建。然后可以将此代码包含在源代码中,并使用其他所有内容控制版本。请注意,使用外部序列化对象是不可能的。
感谢您提供任何帮助。
答案 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
成为更通用的类型(例如Map
或Map<String, Integer>
)。