为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2021-12-10 16:42:07
我在 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    }}我不完全理解这一点,所以如果有人可以向我解释,请不要犹豫!:)
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

嗯……这很有趣,因为transient关键字应该可以解决问题。但是..这只是一个常见用例的捷径。如果处理序列化过程的库或代码忽略它,它可能不起作用。


有一篇很好的文章,涵盖了 JAVA 中的序列化主题(阅读本文)。简而言之:您可以自定义ExclusionStrategy以向您的班级添加专用行为


代码亮点:


ExclusionStrategy strategy = new ExclusionStrategy() {

    @Override

    public boolean shouldSkipField(FieldAttributes field) {

        if (field.getDeclaringClass() == MyClass.class && field.getName().equals("other")) {

            return true;

        }

        if (field.getDeclaringClass() == MySubClass.class && field.getName().equals("otherVerboseInfo")) {

            return true;

        }

        return false;

    }


    @Override

    public boolean shouldSkipClass(Class<?> clazz) {

        return false;

    }

};


Gson gson = new GsonBuilder()

  .addSerializationExclusionStrategy(strategy)

  .create();

String jsonString = gson.toJson(source);


assertEquals(expectedResult, jsonString);

是的..这可能对您的问题来说有点矫枉过正,但它应该适用于所有用例


查看完整回答
反对 回复 2021-12-10
  • 1 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号