打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
(1)解决序列化中的问题java.io.StreamCorruptedException:invalidstreamheader:EFBFB
Java代码 
 
public class TestDeserialize extends TestCase {
public void testDeserialize() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
BigInteger bi = new BigInteger("0");
oos.writeObject(bi);
String str = baos.toString();
System.out.println(str);
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(str.getBytes())));
Object obj = ois.readObject();
}
}
抛出错误
Java代码 
 
[junit] ------------- ---------------- ---------------
[junit] Testcase: testDeserialize(org.jboss.remoting.loading.TestDeserialize):   Caused an ERROR
[junit] invalid stream header: EFBFBDEF
[junit] java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
[junit]  at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
[junit]  at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
[junit]  at org.jboss.remoting.loading.TestDeserialize.testDeserialize(TestDeserialize.java:20)
[junit]
[junit]
[junit] Test org.jboss.remoting.loading.TestDeserialize FAILED
修改成为
Java代码 
 
public void testDeserialize() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
BigInteger bi = new BigInteger("0");
oos.writeObject(bi);
byte[] str = baos.toByteArray();
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(str)));
Object obj = ois.readObject();
assertNotNull(obj);
assertEquals(obj.getClass().getName(),"java.math.BigInteger");
assertEquals(((BigInteger)obj).intValue(), 0);
}
搞定,原因请见
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4968673
The provided test code serializes an object to a ByteArrayOutputStream,converts the generated byte array into a string using theByteArrayOutputStream.toString() method, converts the string back into a bytearray using the String.getBytes() method, and then attempts to deserialize theobject from the byte array using a ByteArrayInputStream. This procedure willin most cases fail because of the transformations that take place withinByteArrayOutputStream.toString() and String.getBytes(): in order to convert thecontained sequence of bytes into a string, ByteArrayOutputStream.toString()decodes the bytes according to the default charset in effect; similarly, inorder to convert the string back into a sequence of bytes, String.getBytes()encodes the characters according to the default charset.Converting bytes into characters and back again according to a given charset isgenerally not an identity-preserving operation. As the javadoc for theString(byte[], int, int) constructor (which is called byByteArrayOutputStream.toString()) states, "the behavior ... when the givenbytes are not valid in the default charset is unspecified". In the test caseprovided, the first two bytes of the serialization stream, 0xac and 0xed (seejava.io.ObjectStreamConstants.STREAM_MAGIC), both get mapped to the character'?' since they are not valid in the default charset (ISO646-US in the JDK I'mrunning). The two '?' characters are then mapped back to the byte sequence0x3f 0x3f in the reconstructed data stream, which do not constitute a validheader. The solution, from the perspective of the test case, is to useByteArrayOutputStream.toByteArray() instead of toString(), which will yield theraw byte sequence; this can then be fed directly to theByteArrayInputStream(byte[]) constructor.
注:在转换成字符串的时候如果使用Base64则可以避免该问题
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
将php序列化到数据库的对象饭序列化成java对象
Java Java 7 源码学习系列(一)——String
Java对各种文件的操作详解
java操作文件
Android上传文件到服务器
Java NIO:NIO概述
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服