亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我在模型類中添加 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 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號