2012-02-11 109 views
3

我在Google的AutoBean序列化和反序列化中遇到了一些問題。 我有一個包含原始類型和地圖的AutoBean。我可以序列化和反序列化原始類型沒有任何問題,但是當我嘗試讀取反序列化的Map時,我得到NullPointerException。 你以前遇到過類似的問題嗎?有一個代表我的問題的JUnit測試。前兩個斷言是通過,但第三個失敗。使用GWT的AutoBean反序列化與HashMap時出現NullPointerException

public class AutoBeanTest { 

    @Test 
    public void test() throws Exception { 
     MyFactory myFactory = AutoBeanFactorySource.create(MyFactory.class); 

     Options options = myFactory.options().as(); 
     options.setMyInt(5); 
     HashMap<Double, Boolean> map = newHashMap(); 
     map.put(8.0, true); 
     map.put(9.1, false); 

     options.setMyMap(map); 

     Options deserialized = AutoBeanCodex.decode(myFactory, Options.class, AutoBeanCodex.encode(AutoBeanUtils.getAutoBean(options)).getPayload()).as(); 
     assertEquals(deserialized.getMyInt(),5); 
     assertTrue(options.getMyMap().containsKey(8d)); 
     assertTrue(deserialized.getMyMap().containsKey(8d)); 
    } 

    public interface MyFactory extends AutoBeanFactory { 
     AutoBean<Options> options(); 
    } 

    public interface Options { 

     public int getMyInt(); 

     void setMyInt(int myInt); 

     Map<Double, Boolean> getMyMap(); 

     void setMyMap(Map<Double, Boolean> myMap); 
    } 
} 
+0

'com.google.web.bindery.autobean.shared.AutoBeanCodexTest'檢查出了很多地圖功能包括把/編碼/解碼 - 我的猜測是,在編碼/解碼已經不精確的值之後,使用雙打作爲關鍵詞是不可靠的。儘管如此,還沒有嘗試過運行你的測試。 – 2012-02-11 21:05:50

回答

1

前段時間我一直在玩AutoBean功能。我認爲它仍然是一種越野車。我很確定異常是由AutoBean代碼中的錯誤引起的,而不是在你的代碼中引起的。

如果您在調試器中運行上述示例代碼並檢查生成的JSON,事情看起來很好。您甚至可以撥打deserialized.getMyMap().size()並獲得正確的值,但是一旦您想訪問發生的內容錯誤。

有一種變通方法,只需使用Map<String, String>,而不是DoubleBoolean和它的作品...