0

wsimport ツールで生成された XMLEncoder クラスでシリアライズしたい。次の構造を持つ多くの ArrayOfXXXXXX クラスがあります。

@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() メソッドがないため、item プロパティはシリアル化されません。私の質問は、ArrayOfSitejournal オブジェクト全体を項目メンバーと一緒にシリアル化するにはどうすればよいですか?

このクラスは生成されているため、コードを変更できません。

シリアル化をカスタマイズするために PersistenceDelegate を記述できることを知っています。しかし、それを逆シリアル化するには、次のような呼び出しが必要です。

arrayOfSitejournal.getItem().add(journal)

そのような PersistenceDelegate を書くのを手伝ってくれませんか。

4

1 に答える 1

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>

正しく逆シリアル化します。

于 2014-08-20T13:30:05.393 に答える