gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:29:00 25 4
gpt4 key购买 nike

我在 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 对象成为 transient 对象,但仍然没有成功。


更新:

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

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

public ExampleClass implements Serializable {

private Handler handler;

@Expose
String someProperty;
}

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

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

我不是很了解这个,所以如果有人能向我解释一下,请不要犹豫! :)

最佳答案

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

有一篇很好的文章,涵盖了 JAVA 中的序列化主题 (read this)。 简而言之:您可以自定义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);

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

关于java - 当我在模型类中添加 Handler 对象时,GSON 对象序列化中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53025289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com