2014-05-14 1 views
0

wsimport 도구로 생성 된 XMLEncoder 클래스로 직렬화하려고합니다. 다음과 같은 구조가 많은 ArrayOfXXXXXX 클래스가 있습니다 항목 속성이 직렬화되지 않도록 더 setItem() 메소드가 없다XMLEncoder를 사용하여 wsimport 생성 클래스를 직렬화하는 방법은 무엇입니까?

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

: 나는 ArrayOfSitejournal 클래스를 직렬화 할 때

@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 개체를 항목 멤버와 함께 serialize 할 수 있습니까?

이 클래스가 생성되었으므로이 코드의 코드를 변경할 수 없습니다.

필자는 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> 

올바르게 반 직렬화합니다.

관련 문제