使用GWT使用HashMap进行AutoBean反序列化时出现NullPointerException

时间:2012-02-11 12:50:36

标签: gwt serialization hashmap nullpointerexception autobean

我对Google的AutoBean序列化和反序列化有一些问题。 我有一个包含基本类型和地图的AutoBean。我可以毫无问题地序列化和反序列化原始类型,但是当我尝试读取反序列化的Map时,我得到NullPointerException。 你以前遇到过类似的问题吗?有一个JUnit测试代表我的问题。前两个断言是通过,但第三个断言失败。

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

2 个答案:

答案 0 :(得分:2)

我前段时间一直在使用AutoBean功能。我认为这仍然是一种马车。我很确定异常是由AutoBean代码中的错误引起的,而不是代码中的错误。

如果您在调试器中运行上面的示例代码并检查生成的JSON,那么事情看起来很好。您甚至可以致电deserialized.getMyMap().size()并获取正确的值,但一旦您想要访问内容,就会出现错误。

有一种解决方法,只需使用Map<String, String>代替DoubleBoolean,它就有效......

答案 1 :(得分:1)

Ackchyually ... Autobeans正确地完成了in JSON only strings are allowed as keys的工作。但是,当然,错误消息应该会更有帮助。