Сериализовать Java-объект для Java-кода?

Есть ли реализация, которая будет сериализовать объект 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

Я реализовал эту функциональность в новом проекте 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 более общий тип (например, Map или Map<String, Integer>).