Сериализация Java-объекта в Java-код? - PullRequest
10 голосов
/ 08 июня 2011

Существует ли реализация, которая сериализует объект 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));

Зачем тебе это? Иногда проще частично создать сложные объекты программно, а затем завершить создание вручную в коде. Этот код затем может быть включен в исходный код и версия, контролируемая всем остальным. Обратите внимание, что использование внешних сериализованных объектов не является исключением.

Спасибо за любую помощь, которую вы можете оказать.

Ответы [ 5 ]

3 голосов
/ 08 декабря 2013

Я реализовал эту функциональность в новом проекте 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 голос
/ 08 июня 2011

Вы можете добиться настраиваемой сериализации ваших объектов. Вы должны реализовать в своем классе два метода с точной подписью:

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


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

Однако степень гибкости, к которой вы стремитесь, весьма сомнительна.

0 голосов
/ 20 ноября 2015

У меня недавно была похожая проблема, и маленький фреймворк 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>).

0 голосов
/ 08 декабря 2013

В предварительном выпуске Long Term Persistence (java.beans.Encoder и друзья) были и XMLEncoder, и Java-кодировщик.Вы, вероятно, все еще можете скачать его где-то.

0 голосов
/ 08 июня 2011

Не могли бы вы вместо этого использовать Clojure и интегрировать его с вашим Java-кодом? Clojure гомоичен - его данные идентичны его коду, так что вы можете делать такие вещи очень легко.

Карты - это базовый тип данных в Clojure.

...