4

GoogleのAutoBeanのシリアル化と逆シリアル化に問題があります。プリミティブ型とマップも含むAutoBeanがあります。プリミティブ型を問題なくシリアル化および逆シリアル化できますが、逆シリアル化されたマップを読み取ろうとすると、NullPointerExceptionが発生します。これまでに同様の問題に遭遇したことがありますか?私の問題を表すJUnitテストがあります。最初の2つのアサートは合格ですが、3番目は失敗します。

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);
    }
}
4

2 に答える 2

2

私はしばらく前にAutoBean機能をいじっていました。まだバギーだと思います。例外は、コードではなく、AutoBeanコードのバグが原因であると確信しています。

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

回避策があります。またはMap<String, String>の代わりに使用するだけで機能します...DoubleBoolean

于 2012-04-12T07:46:10.503 に答える
1

ちなみに... JSONでは文字列のみがキーとして許可されているため、Autobeansは正しく実行しています。しかしもちろん、エラーメッセージはもっと役立つはずです。

于 2019-05-14T11:27:32.030 に答える