我有这个相对简单的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,我不明白为什么。
(我打算用它来将一些小对象序列化为Strings并将它们存储在SharedPreferences中并稍后再读回来。但我现在只使用一个整数,因为这会隔离问题)
答案 0 :(得分: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);
有关详细信息,请查看how to convert byte array to string and vice versa
答案 1 :(得分: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上可用。所以你可能需要寻找不同的实现)