Gson を使用してアプリケーションの状態を JSON として保存し、それをfromJsonを使用して読み取るコードをいくつか継承しました。
Gson gson = createGson();
gson.fromJson(objString, myClass);
保存されるフィールドの 1 つがLocationです。残念ながら、保存された場所の mExtras に mClassLoader が含まれているため、保存されたデータの解析が失敗することが非常にまれであり、Gson ライブラリは次のエラーで ClassLoader の作成に失敗します。
RuntimeException: 引数なしで保護された java.lang.ClassLoader() を呼び出せませんでした
ClassLoader が私の Location のエクストラに含まれている理由と、JSON 表現で終了する必要があるかどうかを知っている人はいますか?
Location オブジェクトの主要なフィールド (経度、緯度、高度、時間、精度など) を個別に保存するだけでこれを修正できると思いますが、可能であれば Location オブジェクトを保存することをお勧めします。
フィールドを除外するために使用できるExclusionStrategyオブジェクトがあることを確認しましたが、それを使用して自分の Location 内からエクストラを除外できるかどうか、または使用する必要があるかどうかはわかりませんでした...
参考までに、これが私の Location オブジェクトの JSON データです (経度と緯度は非表示に変更されています)。
{
<snip>
"lastKnownLocation": {
"mResults": [
0,
0
],
"mProvider": "gps",
"mExtras": {
"mParcelledData": {
"mOwnObject": 1,
"mObject": 5525040
},
"mClassLoader": {
"packages": {}
},
"mMap": {},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
},
"mDistance": 0,
"mTime": 1354658984849,
"mAltitude": 5.199999809265137,
"mLongitude": -122.4376,
"mLon2": 0,
"mLon1": 0,
"mLatitude": 37.7577,
"mLat1": 0,
"mLat2": 0,
"mInitialBearing": 0,
"mHasSpeed": true,
"mHasBearing": false,
"mHasAltitude": true,
"mHasAccuracy": true,
"mAccuracy": 16,
"mSpeed": 0,
"mBearing": 0
},
<snip>
}
コードがクラッシュしない場合の mExtras の内容の例を次に示します。
"mExtras": {
"mParcelledData": {
"mOwnsNativeParcelObject": true,
"mNativePtr": 1544474480
},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
}