7

Parcelable(速い)とSerializable(遅い)のパフォーマンスの違いを知っています。ただし、特定のアプリケーション情報を1つのライフサイクル内だけでなく永続的に保存する必要があるため、onSaveInstanceStateおよびParcelableオブジェクトを利用する関連メソッドは適切ではありません。

だから私はに注意を向けましたSerializable。主にAbstractList保存するタイプがあります-を実装しているので問題ありませんSerializable。しかし、私がこれらの中に保存するタイプの多くは、そうではParcelableありません。SerializableRectF

パーセルを簡単に生成し、Parcelable.writeToParcel(parcel, flags)それを呼び出してシリアル化および逆シリアル化できるmarshall()を作成できるので、「問題ありません」と思いました。byte[]ジェネリックを使用すると思いました。SerializableParcelable<Parcelable> implements Serializableクラスを作成し、Parcelableシリアル化するすべてのタイプに1つのソリューションを提供します。次に、たとえば、各RectFをこのラッパー内ArrayListに格納します。リストとそのParcelable内容はシリアル化可能です。

ただし、APIドキュメントにはmarshall()、永続ストレージに使用してはならないことが記載されています。

public final byte [] marshall()

区画の生のバイトを返します。

ここで取得するデータは、いかなる種類の永続ストレージ(ローカルディスク上、ネットワーク経由など)にも配置しないでください。そのためには、標準のシリアル化または別の種類の一般的なシリアル化メカニズムを使用する必要があります。パーセルマーシャリング表現は、ローカルIPC用に高度に最適化されているため、プラットフォームのさまざまなバージョンで作成されたデータとの互換性を維持しようとはしません。

だから今私は立ち往生しています。この警告を無視して上記で概説したルートに従うか、Parcelableシリアル化する各個人を拡張してオーダーメイドのシリアル化メソッドを作成することで問題を回避できます。これは時間と労力の非常に無駄に思えます。

誰かがParcelable使用せずにオブジェクトをシリアル化するための「正しい」ショートカットを知っていmarshall()ますか?または、指定された警告に注意せずに耕す必要がありますか?おそらくSQLiteデータベースがその方法ですが、よくわかりません。アドバイスをお願いします。

どうもありがとう。

4

1 に答える 1

-2

シリアル化する必要があるオブジェクトには、 を使用できますobjectOutPutStream 。これを使用すると、オブジェクトをデバイスのファイル システムに書き込むことができます。したがって、これを使用してParcelableオブジェクトを保存することもできます。

以下は、オブジェクトをファイル システムに保存するコードです。

    public static void witeObjectToFile(Context context, Object object, String        filename) {

    ObjectOutputStream objectOut = null;
    FileOutputStream fileOut = null;
    try {
        File file = new File(filename);
        if(!file.exists()){
            file.createNewFile();
        }
        fileOut = new FileOutputStream(file,false);
        objectOut = new ObjectOutputStream(fileOut);
        objectOut.writeObject(object);
        fileOut.getFD().sync();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }finally {
        if (objectOut != null) {
            try {
                objectOut.close();
            } catch (IOException e) {
                // do nowt
            }
        }
        if (fileOut != null) {
            try {
                fileOut.close();
            } catch (IOException e) {
                // do nowt
            }
        }
    }
}`

オブジェクトを読み取るには、 を使用しますObjectInputStream。以下のコードを見つけます。

    public static Object readObjectFromFile(Context context, String filename) {

    ObjectInputStream objectIn = null;
    Object object = null;
    FileInputStream fileIn = null;
    try {
        File file = new File(filename);
        fileIn = new FileInputStream(file);//context.getApplicationContext().openFileInput(filename);
        objectIn = new ObjectInputStream(fileIn);
        object = objectIn.readObject();

    } catch (FileNotFoundException e) {
        // Do nothing
    }catch (NullPointerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }finally {
        if (objectIn != null) {
            try {
                objectIn.close();
            } catch (IOException e) {
                // do nowt
            }
        }
        if(fileIn != null){
            try {
                fileIn.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    return object;
}`

よろしく、
シャ

于 2012-03-29T10:11:43.417 に答える