【问题标题】:How to serialize wsimport generated classes with XMLEncoder?如何使用 XMLEncoder 序列化 wsimport 生成的类?
【发布时间】:2014-05-14 12:42:06
【问题描述】:

我想用 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。

【问题讨论】:

    标签: java serialization wsimport xmlencoder


    【解决方案1】:

    我自己找到了解决方案。

    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>
    

    并正确反序列化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-27
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多