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

将Java对象序列化为Java代码?,java,serialization,code-generation,Java,Serialization,Code Generation,是否有将Java对象序列化为Java代码的实现?例如,如果我有对象 Map<String,Integer> m = new Map<String,Integer>(); m.put("foo",new Integer(21)); 例如,输出将是 java.util.Map<String,Integer> m = new java.util.Map<String,Integer>(); m.put("foo",new Integer(21));

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

Map<String,Integer> m = new Map<String,Integer>();
m.put("foo",new Integer(21));
例如,输出将是

java.util.Map<String,Integer> m = new java.util.Map<String,Integer>(); 
m.put("foo",new Integer(21));
java.util.Map m=new java.util.Map();
m、 put(“foo”,新整数(21));
你为什么想要这个?有时,以编程方式部分创建复杂对象,然后在代码中手动完成创建更容易。然后,该代码可以包含在源代码中,并与其他所有内容一起进行版本控制。请注意,使用外部序列化对象也不例外


感谢您提供的帮助。

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

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


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

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

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


映射是Clojure中的基本数据类型。

我在一个新的github项目中实现了此功能。您可以在此处找到该项目:

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

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

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

长期持久性的预发行版(java.beans.Encoder和friends)既有一个XMLEncoder,也有一个java编码器。你可能仍然可以在某个地方下载它。

我最近遇到了一个类似的问题,这个小框架就是从它演变而来的。它还支持不符合JavaBean约定的对象。您的示例可以按如下方式序列化:

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
Map m=newhashmap();
m、 put(“bar”,新整数(21));
CodeSerializer CodeSerializer=新的CodeSerializer();
System.out.println(codeSerializer.serialize(m));//当然,您可以将此字符串放入文件输出流
其结果是:

 HashMap map1 = new LinkedHashMap<>();
 map1.put("foo", 21);
HashMap map1=newlinkedhashmap();
地图1.put(“foo”,21);

你可以调用
serialize(Type,Object)
使
map1
成为一个更通用的类型(例如
Map
Map
)。

我不认为有任何(标准的)方法可以做到这一点(+1)对于“你为什么想要这个”,许多问题想要一些不寻常的东西,但是,它没有解释为什么。还有很多自动代码生成,当主要内容生成时,只有少数细节是手工编码的……另一种选择是静态代码生成(由外部实体生成)——因此您不必手工完成。这样做的好处是,您不必花费CPU周期对其进行反序列化。虽然这已经是很久以前的事了,但您有“以编程方式部分创建复杂对象”和“手动完成创建”的示例吗?您找到合适的替代方案了吗?这是可能的,但它适用于所有Java对象。您仍然会得到一个对象流头。
 HashMap map1 = new LinkedHashMap<>();
 map1.put("foo", 21);