2012-12-28 77 views
0

我正在運行一個使用spring的webapp,我使用xstream作爲序列化工具。 我已經定義了一個marsheller來包含自定義轉換器,但是當讀取一個xml時,似乎我註冊的轉換器被忽略,因爲xstream不能正確解析某些字段。Xstream忽略已註冊的轉換器

這裏是編組的初始化函數:

public void init() { 
    XStream xstream = new XStream() { 

     protected MapperWrapper wrapMapper(MapperWrapper next) { 
      return new MapperWrapper(next) { 

       public boolean shouldSerializeMember(Class definedIn, String fieldName) { 
        return definedIn != Object.class ? super.shouldSerializeMember(definedIn, fieldName) : false; 
       } 

      }; 
     } 

    }; 
    xstream.setMode(XStream.NO_REFERENCES); 
    xstream.addDefaultImplementation(ArrayList.class, PersistentList.class); 
    xstream.addDefaultImplementation(ArrayList.class, PersistentBag.class); 
    xstream.addDefaultImplementation(HashMap.class, PersistentMap.class); 
    xstream.addDefaultImplementation(java.util.HashSet.class, PersistentSet.class); 

    xstream.alias("Array", PersistentBag.class); 
    xstream.alias("list", PersistentBag.class); 

    Mapper mapper = xstream.getMapper(); 
    xstream.registerConverter(new HibernateCollectionConverter(mapper)); 
    xstream.registerConverter(new HibernateMapConverter(mapper)); 
    xstream.registerConverter(new DateConverter()); 
    xstream.registerConverter(new TimeStampCustomConverter()); 
    xstream.registerConverter(new LongConverter()); 
    xstream.registerConverter(new IntConverter()); 
    xstream.registerConverter(new DoubleConverter()); 

} 

我失去了什麼?

+1

此代碼似乎建立了一個'XStream'實例,但然後把它扔掉。你是否保存了一個對'XStream'對象的引用,而不是在你的本地變量中? –

+0

@Ian,你是對的......我改變了我得到xstream的方式來覆蓋函數,謝謝!請提交此作爲答案,我可以接受它 –

+0

完成。謝謝,很高興它有幫助。 –

回答

1

您在XStream類的特定實例上註冊了轉換器等,因此您需要在除init()方法的局部變量之外的某個位置保存對組態的XStream的引用。或替代,使其返回的XStream,然後調用,每當你需要一個編組的方法:

protected XStream createXStream() { 
    XStream xs = new XStream(); 
    // ... 
    xs.registerConverter(...); 
    return xs; 
}