2011-06-08 8 views
10

Czy istnieje implementacja, która serializuje obiekt Java jako kod Java? Na przykład, jeśli mam obiektSerializuj obiekt Java do kodu Java?

Map<String,Integer> m = new Map<String,Integer>(); 
m.put("foo",new Integer(21)); 

mogę serializacji to za pomocą

ObjectOutputStream out = new ObjectOutputStream(...); 
out.writeObject(m); 
out.flush(); 

a wyjście będzie, na przykład, być

java.util.Map<String,Integer> m = new java.util.Map<String,Integer>(); 
m.put("foo",new Integer(21)); 

Dlaczego chcesz tego? Czasami łatwiej jest programowo skompilować złożone obiekty, a następnie zakończyć tworzenie ręcznie w kodzie. Kod ten można następnie włączyć do źródła i wersji kontrolowanej ze wszystkim innym. Zauważ, że używanie zewnętrznych serializowanych obiektów nie jest wyjątkiem.

Dzięki za pomoc, którą możesz udzielić.

+2

Nie sądzę, że istnieje jakikolwiek (standardowy) sposób na zrobienie tego –

+1

(+1) dla "Dlaczego tego chcesz", wiele pytań wymaga czegoś niezwykłego, ale nie wyjaśnia dlaczego. A tam jest dużo generowania kodu auta, kiedy generowane są główne rzeczy, a tylko kilka szczegółów jest kodowanych ręcznie ... – umlcat

+1

Inną opcją jest generowanie kodu statycznego (przez obiekt zewnętrzny) - więc nie musisz tego robić ręcznie. Zaletą tego jest to, że nie musisz tracić cykli procesora, deserializując go. – mindas

Odpowiedz

1

Możesz może osiągnąć niestandardową serializację swoich obiektów. Trzeba zaimplementować dwie metody w klasie z dokładną sygnatura:

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


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

Jednakże ilość elastyczności że poszukiwany jest bardzo wątpliwe.

+0

Nadal będziesz otrzymywać nagłówek strumienia obiektu. – EJP

0

Czy możesz zamiast tego użyć Clojure i zintegrować go z kodem Java? Clojure jest homoiconic - jego dane są identyczne z jego kodem, więc możesz łatwo zrobić takie rzeczy.

Mapy są podstawowym typem danych w Clojure.

3

Zaimplementowałem tę funkcjonalność w nowym projekcie Github. Można znaleźć projekt tutaj:

https://github.com/ManuelB/java-bean-to-code-serializer

Projekt nie posiada żadnych zewnętrznych zależności wyjątkiem JUnit.

Obecnie nie obsługuje jeszcze tablic do serializacji. Niemniej jednak istnieje już wiele funkcjonalności:

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

pre-release of Long Term Trwałość (java.beans.Encoder i przyjaciół) miał zarówno XMLEncoder i koder Java. Prawdopodobnie możesz go jeszcze gdzieś pobrać.

0

Niedawno miałem podobny problem i opracowałem z niego mały szkielet testrecorder. Obsługuje również obiekty niezgodne z Konwencjami Java Bean. Twój przykład być serializable tak:

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 

a wyjście będzie:

HashMap map1 = new LinkedHashMap<>(); 
map1.put("foo", 21); 

One mogą wywołać serialize(Type, Object) aby map1 bardziej ogólny typ (np Map lub Map<String, Integer>).