当我在模型类中添加 Handler 对象时,GSON 对象序列化中断

我在 Android 中有一个 POJO,它是使用 GSON 从服务器的 JSON 响应序列化的,没有任何问题。


public ExampleClass implements Serializable {

    @Expose 

    String someProperty;

}

出于某种原因,我想在我的类中存储一个 Handler 对象,例如:


public ExampleClass implements Serializable {


    private Handler handler = new Handler();


    @Expose 

    String someProperty;

}

添加此额外行后,序列化中断


java.lang.RuntimeException: Failed to invoke public com.example.android.ExampleClass() with no args

我试过为我的班级添加一个无参数构造函数,但没有成功。我已经尝试使 Handler 对象成为瞬态,但仍然没有成功。


更新:


所以,我找到了解决方案。这里的问题是Handler对象在完成对象的序列化之前就被初始化了。


所以这并没有破坏序列化:


public ExampleClass implements Serializable {


    private Handler handler;


    @Expose 

    String someProperty;

}

但是在哪里初始化呢?如果我尝试在 no-args 构造函数中执行此操作,序列化将再次中断:


public ExampleClass implements Serializable {


    private Handler handler;


    @Expose 

    String someProperty;


    public ExampleClass() {

        handler = new Handler(); // breaks serialization 

    }

}

如果我稍后在序列化完成后对其进行初始化,它会起作用:


public ExampleClass implements Serializable {


    private Handler handler;


    @Expose 

    String someProperty;


    public void functionCalledInTheFuture() {

        handler = new Handler(); // works

    }

}

我不完全理解这一点,所以如果有人可以向我解释,请不要犹豫!:)


眼眸繁星
浏览 179回答 1
1回答

叮当猫咪

嗯……这很有趣,因为transient关键字应该可以解决问题。但是..这只是一个常见用例的捷径。如果处理序列化过程的库或代码忽略它,它可能不起作用。有一篇很好的文章,涵盖了 JAVA 中的序列化主题(阅读本文)。简而言之:您可以自定义ExclusionStrategy以向您的班级添加专用行为代码亮点:ExclusionStrategy strategy = new ExclusionStrategy() {&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean shouldSkipField(FieldAttributes field) {&nbsp; &nbsp; &nbsp; &nbsp; if (field.getDeclaringClass() == MyClass.class && field.getName().equals("other")) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if (field.getDeclaringClass() == MySubClass.class && field.getName().equals("otherVerboseInfo")) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean shouldSkipClass(Class<?> clazz) {&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }};Gson gson = new GsonBuilder()&nbsp; .addSerializationExclusionStrategy(strategy)&nbsp; .create();String jsonString = gson.toJson(source);assertEquals(expectedResult, jsonString);是的..这可能对您的问题来说有点矫枉过正,但它应该适用于所有用例
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java