10

いくつかのメンバー変数を持つクラスを作成しました。これらはすべてシリアライズ可能です... 1 つのビットマップを除いて! Bitmap を final クラスとは考えずに、bitmap を拡張して serializable を実装しようとしました。

クラスを保存して (基本的にはゲームの現在の状態を形成します)、プレーヤーがゲームをピックアップしてロードできるようにします。

私の見方では、2 つの選択肢があります。1) ゲームの状態を保存する別の方法を見つける。ここで何か助けていただければ幸いです。

2)ビットマップメンバー変数をintに変更し、intに基づいてビットマップを返す静的メソッドを持つBitmapGetterクラスを作成します。(このオプションは簡単ではありません。私のクラスには非常に多くのビットマップの可能性が含まれており、私がゲームを作成した方法では、信じられないほどの労力が必要になることを意味します。

基本的に、何も考えずにビットマップ変数を怠惰に作成したのは自分以外に責任はありませんが、助けていただければ幸いです...

4

6 に答える 6

15

Bitmap を次のようなクラスに置き換えるのはどうですか:

public class SerialBitmap implements Serializable {

    public Bitmap bitmap;

    // TODO: Finish this constructor
    SerialBitmap(<some params>) {
        // Take your existing call to BitmapFactory and put it here
        bitmap = BitmapFactory.decodeSomething(<some params>);
    }

    // Converts the Bitmap into a byte array for serialization
    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteStream);
        byte bitmapBytes[] = byteStream.toByteArray();
        out.write(bitmapBytes, 0, bitmapBytes.length);
    }

    // Deserializes a byte array representing the Bitmap and decodes it
    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        int b;
        while((b = in.read()) != -1)
            byteStream.write(b);
        byte bitmapBytes[] = byteStream.toByteArray();
        bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
    }
}

オーバーライドされた Serializable.writeObject() および readObject() メソッドは、Bitmap の代わりにバイトをシリアライズするため、クラスはシリアライズ可能になります。現在、ビットマップをどのように構築しているかがわからないため、コンストラクターを終了する必要があります。最後に、YourClass.bitmap への参照を YourClass.serialBitmap.bitmap に置き換えます。

幸運を!

Barry PS このコードはコンパイルできますが、実際のビットマップでテストしていません。

于 2011-05-14T16:44:27.820 に答える
2

私も同じ問題を抱えていました。

と、こう決めました。

BitmapですParcelableので、クラスに合わせて作成しました。

  1. objectを取得するConstructorと、 Objects データを表すBundleを返すgetterを作成しました。したがって、Bitmapparcelable ですが、Bundleはbitmapparcelableとして保存できます。 Bundle

  2. インテントで Date を渡す必要がある場合は、オブジェクト getBundle()メソッドを呼び出して渡すことができますIntent.putExtra(String key,Bundle value)

  3. ターゲット アクティビティでは、それを呼び出してコンストラクターgetBundle(String key)に渡します。

    とても簡単なアプローチだと思います。

于 2015-02-26T10:49:38.137 に答える
1

アプリケーションにビットマップデータを個別に保存しても問題がない場合は、次の操作を実行できます。

現在の状態を保存するクラスで、ビットマップを選択したフォルダーに保存します。

FileOutputStream out = new FileOutputStream(<path to bmp>);
bitmap.compress(CompressFormat.PNG, 100, out);

メンバーとしてビットマップを持つクラスで、シリアル化可能なメンバーとしてパスを持ち、逆シリアル化後にビットマップを再構築します。

public class MyClass implements Serializable
{
    // ...
    private String bitmapPath;
    transient Bitmap bitmap;
    // ...

    private void writeObject(ObjectOutputStream out) throws IOException
    {
        out.defaultWriteObject();
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
    {
        in.defaultReadObject();
        bitmap = BitmapFactory.decodeFile(path);
    }

readObject()オブジェクトは呼び出し後に完全に構​​築されるため、必要に応じて関数に他のビルドアップ機能を実装できdefaultReadObject()ます。

お役に立てれば。

ところで、http:Parcelable //developer.android.com/reference/android/os/Parcel.htmlは、シリアル化の目的で使用しないことをお勧めします。コメントを残すのに十分なポイントがまだないので、私はこのコメントを入れるために自分の答えを編集しています。

于 2011-07-10T09:05:48.480 に答える
0

まず、Parcelableを介してシリアル化する必要があります。これは Android クラスであり、通常はそのままで問題なく動作します。次のメソッドを使用して、ByteArray をシリアル化できます。

public final void writeByteArray (byte[] b)

public final void readByteArray (byte[] val)

Parcelのドキュメントも確認してください。

于 2011-05-14T15:37:17.643 に答える
0

次の Java メソッドを使用して手動でシリアル化を行うことができます。

private void writeObject(java.io.ObjectOutputStream out)
private void readObject(java.io.ObjectInputStream in)

getPixels を使用してビットマップをシリアル化し、逆シリアル化を行うときに createBitmap を使用して最初から再作成できます。

ここで readObject と writeObject の使用方法について読むことができます: http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html

于 2011-05-14T15:39:27.260 に答える