【问题标题】:Serialize and De-serialize PublisherInterstitialAd object序列化和反序列化 PublisherInterstitialAd 对象
【发布时间】:2016-10-14 18:30:52
【问题描述】:

是否可以对 Google DFP 广告的 PublisherInterstitialAd 对象进行序列化和反序列化,以便在 SharedPreferences 中保存和检索该对象?

当我尝试使用 Gson 库时,我得到了 StackOverflowError。请建议如何最好地做到这一点,以及在我目前的方法中我会出错的地方。

谢谢。

这些是用于在 SharedPreferences 中保存和检索 Ad 对象的方法,其中 publisherInterstitialAd 是有问题的对象。

public void saveInterstitialAd(PublisherInterstitialAd publisherInterstitialAd) {
    Gson gson = new Gson();
    String json = gson.toJson(publisherInterstitialAd);
    mEditor.putString("InterstitialAd", json);
    mEditor.commit();
}

public PublisherInterstitialAd getInterstitialAd(){
    Gson gson = new Gson();
    String json = mSharedPrefs.getString("InterstitialAd", "");
    if(json.equals(""))
        return null;
    return gson.fromJson(json, PublisherInterstitialAd.class);
}

这是我得到的堆栈跟踪:

未捕获异常 java.lang.StackOverflowError 在 java.lang.Class.isArray(Class.java:1118) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:96) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:551) 在 com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:109) 在 com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:544) 在 com.google.gson.internal.$Gson$Types.canonical

【问题讨论】:

  • 如果您按照您的说法尝试过此操作,请分享代码,包括您的错误的完整堆栈跟踪 - 这对试图提供帮助的人会更有帮助。就目前而言,您的问题只会征求意见,因为没有人可以看到您所做的事情。

标签: serialization sharedpreferences deserialization google-dfp android gson


【解决方案1】:

我认为 Google 会争辩说您不应该长期存储广告。他们必须知道他们的 Ad 对象不是可序列化或 Parcelable 的,所以这让我相信这是故意的。

话虽如此,如果你真的必须的话,你总是可以将对象存储在你的 Application 对象上(不过,我真的不建议这样做,因为这是一个充满陷阱的严重反模式)。我建议您只在可能最终显示的任何活动中询问插页式广告(例如,如果您的目标是在 Activity 完成后显示插页式广告,则可能在第一次创建 Activity 时加载插页式广告,然后在你完成活动之前显示它,在用户完成你希望他们执行的任何操作之后)。

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2020-02-24
    • 2020-05-03
    • 2013-05-01
    • 2016-11-20
    相关资源
    最近更新 更多