2017-06-08 6 views
0

私はAndroidアプリケーションを開発中で、なんらかの理由で(onSaveInstanceState()メソッドを使用して)ディスクにオブジェクトを格納してから、それを再びSerialization/Parcelableで(onRestoreInstanceState()メソッドで)取り戻す必要があります。ライブラリ内のオブジェクトをシリアル化する方法は?

分かりやすいように、クラスをParcelableにするには、Parcelerライブラリを使用するか、定型コードを書く必要があります。

私の問題は、クラスを作成していないオブジェクトがいくつかあることです。彼らはサードパーティまたはAndroid-SDK関連のクラスです。

private FragNavController mNavController; 
private MenuItem mMenuItem; 
private SharedPreferences mPrefs; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    LayoutInflaterCompat.setFactory(getLayoutInflater(), new IconicsLayoutInflater(getDelegate())); 
    setDefaultLanguage(Locale.ENGLISH.toString()); 
    //Paper.init(getApplicationContext()); 

    mPrefs = getPreferences(MODE_PRIVATE); 
    super.onCreate(savedInstanceState); 
    . 
    . 
    . 
} 

は私がParceler図書館、XstreamicepickpaperGson and sharedPreferences Methodを使用しますが、それらのすべてで、私はmNavControllermMenuItemのようないくつかのオブジェクトを保存するために失敗します。明確にするためにここに私のコードです。

誰もこの問題に直面していましたが、これらのオブジェクトを保存する最良のソリューションを知っていますか?

答えて

0

回答無し:do なしこれを行う。

オブジェクトのシリアライズはです。常にトリッキーなビジネスです。あなたはバージョン管理を注視しなければなりません。アプリのアップグレードで、が以前にシリアライズされたオブジェクトへのアクセスを壊すことはありません。

これはあなたの自身のもののために十分に難しい場合があります。しかし、あなたは知っているオブジェクトをシリアル化しようとしています何もないについて。したがって、第三者がクラスに変更する場合は、がアプリに直接影響する可能性があります。最後に、製品に関連するではないのカスタマーデバイスのアップデートが発生する可能性があります。突然以前にシリアライズされたオブジェクトをすべてデシリアライズできないためです。

かいつまん:「単に」、それが使用しているすべてのオブジェクトを保存することにより、アプリケーションの状態を維持するために慎重なります。はるかに頑強なアプローチは、設計段階の "データ要素"を取り除くことです。そのデータをデータとして保存できることを確認してください。オブジェクトを格納するのではなく、それらのオブジェクトとして、あなたのデータが含まれています。おそらくあなたが気にしていない他の多くのものがおそらくあります。しかし、あなたはそれらを連載しなければならないので、あなたはまだこれらの他のことについて考えることを余儀なくされています。

つまり、A)まず、永続化する必要のあるデータを分離する必要があります。あなたがそのB)を得たとき、あなたはその情報を永続させる良い方法を探します。独自のデータベースや共有設定を使用している場合は、要件によって異なる場合があります。

+0

ありがとうございます。 "もっと堅牢なアプローチは、設計段階の"データ要素 "を特定し、そのデータをデータとして保存できるようにすることです。 店舗データのデータベースをセットアップすることをお勧めしますか? –

+0

更新を見る – GhostCat

0

これはParcelerのドキュメントにありますか?Javaソースに対応するクラスのJavaソース


せず

クラスは一つ は@ParcelClassアノテーションを使用してパーセルとしてクラスを含むことができる、利用可能でありません。 この注釈は、 が便利なコンパイルされたソースのどこにでも宣言することができます。例えば、一つは、Androidアプリケーションと 沿っ@ParcelClassを含むことができる:

@ParcelClass(LibraryParcel.class) public class AndroidApplication extends Application{ //... } 

複数@ParcelClassアノテーションは@ParcelClassesアノテーションを使用して宣言することができます。

@ParcelClassで参照されるクラスは、@Parcelアノテーションを使用して に設定することもできます。これにより、直列化手法を含む@Parcel 注釈で使用可能なパラメータを使用してシリアル化 を設定し、 を分析することができます。

@ParcelClass(
    value = LibraryParcel.class, 
    annotation = @Parcel(converter = LibraryParcelConverter.class)) class SomeClass{} 

これは直接変更には使用できませんクラス 以上のきめの細かい制御が可能になります:

一つの有用な技術はタイプのためのグローバルなカスタム・コンバータ を定義する機能です。

https://github.com/johncarl81/parceler#classes-without-java-source

だから私は、あなたがそれを行うと、カスタムコンバータを記述する必要があると思います。

+0

comment.yesのおかげで、私は前にやったことがあり、その特定のメンバーvariables.butのカスタムコンバータを書くdoes'nt仕事! –

+0

このコードを投稿して問題を説明してください。 – nasch

関連する問題