2014-05-14 8 views
0

Я хочу сериализовать классы XMLEncoder, созданные с помощью инструмента wsimport. Есть много ArrayOfXXXXXX классов, которые имеют следующую структуру:Как сериализовать классы, генерируемые wsimport, с помощью XMLEncoder?

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "ArrayOfSitejournal", propOrder = { 
    "item" 
}) 
public class ArrayOfSitejournal 
    implements Serializable 
{ 

    protected List<Journal> item; 

    public List<Journal> getItem() { 
     if (item == null) { 
      item = new ArrayList<Journal>(); 
     } 
     return this.item; 
    } 
} 

Когда я сериализацию ArrayOfSitejournal класса я получаю этот выход:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.7.0_45" class="java.beans.XMLDecoder"> 
<object class="ArrayOfSitejournal"/> 
</java> 

Там нет метода SetItem(), поэтому пункт свойство не сериализуется. Мой вопрос: как я могу сериализовать весь объект ArrayOfSitejournal вместе с элементом элемента?

Я не могу изменить код этого класса, так как он сгенерирован.

Я знаю, что могу написать PersistenceDelegate для настройки сериализации. Но для десериализации это вызов, как это необходимо:

arrayOfSitejournal.getItem().add(journal) 

Можете ли вы помочь мне написать такую ​​PersistenceDelegate.

ответ

0

Я нашел решение самостоятельно.

encoder.setPersistenceDelegate(ArrayOfSitejournal.class, new DefaultPersistenceDelegate() { 
    protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { 
     super.initialize(type, oldInstance, newInstance, out); 

     ArrayOfSitejournal m = (ArrayOfSitejournal)oldInstance; 

     Expression expression = new Expression(oldInstance, "getItem", new Object[] {}); 
     out.writeExpression(expression); 
    } 
}); 

Я не уверен, что это правильно, но это работает. Он генерирует следующие данные:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.7.0_45" class="java.beans.XMLDecoder"> 
<object class="ArrayOfSitejournal"> 
    <void property="item"> 
    <void method="add"> 
    <object class="Journal"> 
    <void property="changeType"> 
     <string>start</string> 
    </void> 
    <void property="itemId"> 
     <long>4239463180</long> 
    </void> 
    </object> 
    </void> 
    <void method="add"> 
    <object class="Journal"> 
    <void property="changeType"> 
     <string>now</string> 
    </void> 
    <void property="itemId"> 
     <long>4239463180</long> 
    </void> 
    </object> 
    </void> 
    </void> 
</object> 
</java> 

и десериализуется правильно.