Сериализовать 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>
).