4

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

2 回答 2

2

前段时间我一直在玩弄 AutoBean 功能。我认为它仍然是一辆越野车。我很确定异常是由 AutoBean 代码中的错误引起的,而不是在您的代码中。

如果您在调试器中运行上述示例代码并检查生成的 JSON,则一切正常。您甚至可以调用deserialized.getMyMap().size()并获取正确的值,但是一旦您要访问内容就会发生错误。

有一种解决方法,只需使用Map<String, String>代替DoubleorBoolean就可以了...

于 2012-04-12T07:46:10.503 回答
1

Ackchyually... Autobeans 做的很正确,因为在 JSON 中只允许字符串作为键。但当然,错误消息应该更有帮助。

于 2019-05-14T11:27:32.030 回答