Kiedy ArrayList to nie ArrayList
April 16th, 2010Bawiąc się serializacją obiektów do XML trafiłem na XStream. W przeciwieństwie do standardowej pary XMLDecoder/XMLEncoder serializuje wszystkie pola a nie tylko te które posiadają gettery/settery. Generowany XML jest także zdecydowanie bardziej przejrzysty:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_13">
<object class="TestClass">
<void property="text">
<string>żółć</string>
</void>
<void property="check1">
<boolean>false</boolean>
</void>
<void property="check2">
<boolean>false</boolean>
</object>
</java>
vs
<TestClass>
<text>żółć</text>
<check1>false</check1>
<check2>true</check2>
</TestClass>
Natrafiłem jednak na problem – XStream nie potrafił zapisać zwykłej listy, a przynajmniej ignorował zawartość:
<select class="java.util.Arrays$ArrayList">
<a/>
</select>
Na ten sam problem trafił już wcześniej Jim Barritt i udało mu się znaleźć przyczynę . Jak się okazało lista zwracana przez Arrays.asList() to nie zwykłe java.util.ArrayList ale zupełnie inna klasa o nazwie ArrayList będa inner class w java.util.Arrays. XStream do serializacji używa wielu rożnych konwerterów i niestety nie wie, że CollectionConverter powinien być użyty także dla tej klasy. Niestety dla mnie to oznacza dyskwalifikację XStreama - nie mam czasu szukać przyczyny ewentualnej błędnej serializacji.