第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

當(dāng)我在模型類中添加 Handler 對(duì)象時(shí),GSON 對(duì)象序列化中斷

當(dāng)我在模型類中添加 Handler 對(duì)象時(shí),GSON 對(duì)象序列化中斷

眼眸繁星 2021-12-10 16:42:07
我在 Android 中有一個(gè) POJO,它是使用 GSON 從服務(wù)器的 JSON 響應(yīng)序列化的,沒(méi)有任何問(wèn)題。public ExampleClass implements Serializable {    @Expose     String someProperty;}出于某種原因,我想在我的類中存儲(chǔ)一個(gè) Handler 對(duì)象,例如: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我試過(guò)為我的班級(jí)添加一個(gè)無(wú)參數(shù)構(gòu)造函數(shù),但沒(méi)有成功。我已經(jīng)嘗試使 Handler 對(duì)象成為瞬態(tài),但仍然沒(méi)有成功。更新:所以,我找到了解決方案。這里的問(wèn)題是Handler對(duì)象在完成對(duì)象的序列化之前就被初始化了。所以這并沒(méi)有破壞序列化:public ExampleClass implements Serializable {    private Handler handler;    @Expose     String someProperty;}但是在哪里初始化呢?如果我嘗試在 no-args 構(gòu)造函數(shù)中執(zhí)行此操作,序列化將再次中斷:public ExampleClass implements Serializable {    private Handler handler;    @Expose     String someProperty;    public ExampleClass() {        handler = new Handler(); // breaks serialization     }}如果我稍后在序列化完成后對(duì)其進(jìn)行初始化,它會(huì)起作用:public ExampleClass implements Serializable {    private Handler handler;    @Expose     String someProperty;    public void functionCalledInTheFuture() {        handler = new Handler(); // works    }}我不完全理解這一點(diǎn),所以如果有人可以向我解釋,請(qǐng)不要猶豫!:)
查看完整描述

1 回答

?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊

嗯……這很有趣,因?yàn)閠ransient關(guān)鍵字應(yīng)該可以解決問(wèn)題。但是..這只是一個(gè)常見(jiàn)用例的捷徑。如果處理序列化過(guò)程的庫(kù)或代碼忽略它,它可能不起作用。


有一篇很好的文章,涵蓋了 JAVA 中的序列化主題(閱讀本文)。簡(jiǎn)而言之:您可以自定義ExclusionStrategy以向您的班級(jí)添加專用行為


代碼亮點(diǎn):


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);

是的..這可能對(duì)您的問(wèn)題來(lái)說(shuō)有點(diǎn)矯枉過(guò)正,但它應(yīng)該適用于所有用例


查看完整回答
反對(duì) 回復(fù) 2021-12-10
  • 1 回答
  • 0 關(guān)注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)