2012-02-11 43 views
3

GoogleのAutoBeanのシリアル化とデシリアライズに問題があります。 私はプリミティブ型とマップも含むAutoBeanを持っています。私はシリアライズすることができますし、問題のないプリミティブ型をdeserialize、私はdeserialized Mapを読み込もうとすると、私はNullPointerExceptionを取得します。 以前にも同様の問題を経験したことがありますか?私の問題を表すJUnitテストがあります。最初の2つのアサートはパスですが、3番目のアサートは失敗します。HashMapでGWTのAutoBeanデシリアライズを使用すると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'は機能には、マップの多くをチェックアウト...

はちょうどMap<String, String>の代わりに、DoubleまたはBoolean使用し、回避策はあり、それが動作しますencode/decodeを渡す/取得する - 私の推測では、すでに不正確な値をエンコード/デコードした後に、倍精度文字をキーとして使用して何かがうねっていると思われるでしょう。まだあなたのテストを実行しようとしていない。 –

答えて

1

私はずっと前からAutoBeanの機能を使い続けてきました。私はまだそれは一種のバギーだと思う。例外は、あなたのコードではなく、AutoBeanコードのバグが原因であると確信しています。

デバッガで上記のサンプルコードを実行し、生成されたJSONをチェックすると、正常に表示されます。 deserialized.getMyMap().size()に電話して正しい値を取得することもできますが、一度コンテンツにアクセスするにはエラーが発生します。

関連する問題