Android可序列化问题

JXX*_*XXH 10 android bitmap serializable

我创建了一个类,它有几个成员变量,所有这些变量都是可序列化的...除了一个Bitmap!我试图扩展位图并实现可序列化,而不是认为Bitmap是最终类.

我想保存课程(它基本上形成了游戏的当前状态),因此玩家可以提升并加载游戏.

我看到它的方式我有两个选择:1)找到另一种方法来保存游戏状态.任何帮助在这里将不胜感激.

2)比较将位图成员变量更改为int,并创建一个BitmapGetter类,该类具有基于int返回位图的静态方法.(这个选项并不容易,因为我的类包含了很多位图可能性,而且我创建游戏的方式意味着需要付出巨大的努力.

基本上我没有人可以责备,但我自己懒得创造一个位图变量而不考虑,但我会感激任何帮助......

Bar*_*man 14

如何用这样的类替换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);
    }
}
Run Code Online (Sandbox Code Playgroud)

重写的Serializable.writeObject()和readObject()方法序列化字节而不是位图,因此类是可序列化的.您将需要完成构造函数,因为我不知道您当前如何构造您的Bitmap.最后要做的是用YourClass.serialBitmap.bitmap替换对YourClass.bitmap的引用.

祝好运!

Barry PS这段代码编译但我没有用真正的位图测试它

  • 我不建议使用Parcelable,因为Parcel文档特别警告不要将其用作通用序列化机制. (2认同)

fer*_*tar 0

首先,您应该通过Parcelable进行序列化。它是一个 Android 类,通常开箱即用,效果很好:您可以使用它序列化 ByteArray,方法如下:

public final void writeByteArray (byte[] b)
Run Code Online (Sandbox Code Playgroud)

public final void readByteArray (byte[] val)
Run Code Online (Sandbox Code Playgroud)

您可能还想查看Parcel文档。