首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用XMLEncoder序列化wsimport生成的类?

问如何用XMLEncoder序列化wsimport生成的类?
EN

Stack Overflow用户
提问于 2014-05-14 20:42:06
回答 1查看 594关注 0票数 0

我想使用wsimport工具生成的XMLEncoder类进行序列化。有许多ArrayOfXXXXXX类具有以下结构:

代码语言:javascript
复制
@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类时,我得到以下输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_45" class="java.beans.XMLDecoder">
 <object class="ArrayOfSitejournal"/>
</java>

没有setItem()方法,因此item属性未序列化。我的问题是:如何将整个ArrayOfSitejournal对象与item成员一起序列化?

我不能更改这个类的代码,因为它是生成的。

我知道我可以编写PersistenceDelegate来定制序列化。但要对其进行反序列化,像这样的调用是必要的:

代码语言:javascript
复制
arrayOfSitejournal.getItem().add(journal)

你能帮我写这样的PersistenceDelegate吗?

EN

回答 1

Stack Overflow用户

发布于 2014-08-20 21:30:05

我自己找到了解决方案。

代码语言:javascript
复制
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);
    }
});

我不确定它是否正确,但它是有效的。它会生成以下输出:

代码语言:javascript
复制
<?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>

并正确地反序列化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23655084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档