1

我有这段相对简单的 Java(适用于 Android)代码,我已经针对这个问题进行了精简。

int number = 42;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(number);
String serial = bos.toString("UTF-8");
os.close();

ByteArrayInputStream bis = new ByteArrayInputStream(serial.getBytes("UTF-8"));
ObjectInputStream is = new ObjectInputStream(bis);    // <<<< Exception Here

最后一行,初始化 ObjectInputStream,抛出一个 StreamCorruptedException,我不知道为什么。

(我打算用它来将一些小对象序列化为字符串并将它们存储在 SharedPreferences 中,稍后再读回它们。但我现在只使用一个整数,因为这样可以隔离问题)

4

2 回答 2

2

问题是字节到字符串的转换,反之亦然。尝试以下操作,它应该可以工作:

int number = 42;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(number);
os.close();

byte[] serial = bos.toByteArray();

ByteArrayInputStream bis = new ByteArrayInputStream(serial);
ObjectInputStream is = new ObjectInputStream(bis); 

有关详细信息,请查看如何将字节数组转换为字符串,反之亦然

于 2013-07-06T21:12:25.890 回答
2

问题在于转换本身。如果我们使用 char 编码将其转换为字符串或从字符串转换,我们不能期望得到相同的字节数组。

简单的例子:

byte[] expected = { -1, -2, -3, -4, -5 };
byte[] actual = new String(expected).getBytes();

// actual is now [-17, -65, -67, -17, -65, -67, -17, -65, -67]

因此,如果要将字节存储在 String 中,请使用 Base64 编码:

int number = 42;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(number);
String serial = new BASE64Encoder().encode(bos.toByteArray());
os.close();

ByteArrayInputStream bis = new ByteArrayInputStream(new BASE64Decoder().decodeBuffer(serial));
ObjectInputStream is = new ObjectInputStream(bis);

(无法判断该类在 android 上是否可用。因此您可能需要寻找不同的实现)

于 2013-07-06T21:16:00.310 回答