【问题标题】:Serialize a Java object to Java code?将Java对象序列化为Java代码?
【发布时间】:2011-09-11 00:07:45
【问题描述】:

是否有将 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));

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

感谢您提供的任何帮助。

【问题讨论】:

  • 我认为没有任何(标准)方法可以做到这一点
  • (+1) 表示“你为什么想要这个”,很多问题都想要一些不寻常的东西,但是,它没有解释为什么。那里有很多自动代码生成,当主要的东西生成时,只有少数细节是手工编码的......
  • 另一种选择是静态代码生成(由外部实体) - 因此您不必手动进行。这样做的好处是您不必花费 CPU 周期对其进行反序列化。
  • 虽然是前段时间,但有没有“以编程方式部分创建复杂对象”和“手动完成创建”的示例?你找到合适的替代品了吗?
  • 这是可能的,但它适用于所有 Java 对象。

标签: java serialization code-generation


【解决方案1】:

我在一个新的 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());

【讨论】:

    【解决方案2】:

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

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

    但是,您所寻求的灵活性程度值得怀疑。

    【讨论】:

    • 你仍然会得到一个对象流头。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      Long Term Persistence 的预发布版本(java.beans.Encoder 和朋友)同时具有 XMLEncoder 和 Java 编码器。您可能仍然可以在某个地方下载它。

      【讨论】:

        【解决方案5】:

        我最近遇到了类似的问题,小框架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&lt;String, Integer&gt;)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-28
          • 2015-11-14
          • 2020-05-07
          • 1970-01-01
          • 2023-04-03
          相关资源
          最近更新 更多