`
san_yun
  • 浏览: 2654510 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java.io.StreamCorruptedException: invalid stream header: EFBFBDEF

 
阅读更多
Java代码  收藏代码
  1. public class TestDeserialize extends TestCase {  
  2.     public void testDeserialize() throws IOException, ClassNotFoundException {  
  3.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  4.         ObjectOutputStream oos = new ObjectOutputStream(baos);  
  5.         BigInteger bi = new BigInteger("0");  
  6.         oos.writeObject(bi);  
  7.         String str = baos.toString();  
  8.         System.out.println(str);  
  9.         ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(str.getBytes())));  
  10.         Object obj = ois.readObject();  
  11.     }  
  12. }  

 

抛出错误

 

 

Java代码  收藏代码
  1. [junit] ------------- ---------------- ---------------  
  2.    [junit] Testcase: testDeserialize(org.jboss.remoting.loading.TestDeserialize):   Caused an ERROR  
  3.    [junit] invalid stream header: EFBFBDEF  
  4.    [junit] java.io.StreamCorruptedException: invalid stream header: EFBFBDEF  
  5.    [junit]  at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)  
  6.    [junit]  at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)  
  7.    [junit]  at org.jboss.remoting.loading.TestDeserialize.testDeserialize(TestDeserialize.java:20)  
  8.    [junit]   
  9.    [junit]   
  10.    [junit] Test org.jboss.remoting.loading.TestDeserialize FAILED  

 

修改成为

 

 

Java代码  收藏代码
  1. public void testDeserialize() throws IOException, ClassNotFoundException {  
  2.     ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  3.     ObjectOutputStream oos = new ObjectOutputStream(baos);  
  4.     BigInteger bi = new BigInteger("0");  
  5.     oos.writeObject(bi);  
  6.     byte[] str = baos.toByteArray();  
  7.     ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(str)));  
  8.     Object obj = ois.readObject();  
  9.     assertNotNull(obj);  
  10.     assertEquals(obj.getClass().getName(),"java.math.BigInteger");  
  11.     assertEquals(((BigInteger)obj).intValue(), 0);  
  12. }  

 

搞定,原因请见

 

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 the
ByteArrayOutputStream.toString() method, converts the string back into a byte
array using the String.getBytes() method, and then attempts to deserialize the
object from the byte array using a ByteArrayInputStream.  This procedure will
in most cases fail because of the transformations that take place within
ByteArrayOutputStream.toString() and String.getBytes(): in order to convert the
contained sequence of bytes into a string, ByteArrayOutputStream.toString()
decodes the bytes according to the default charset in effect; similarly, in
order 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 is
generally not an identity-preserving operation.  As the javadoc for the
String(byte[], int, int) constructor (which is called by
ByteArrayOutputStream.toString()) states, "the behavior ... when the given
bytes are not valid in the default charset is unspecified".  In the test case
provided, the first two bytes of the serialization stream, 0xac and 0xed (see
java.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'm
running).  The two '?' characters are then mapped back to the byte sequence
0x3f 0x3f in the reconstructed data stream, which do not constitute a valid
header. 

The solution, from the perspective of the test case, is to use
ByteArrayOutputStream.toByteArray() instead of toString(), which will yield the
raw byte sequence; this can then be fed directly to the
ByteArrayInputStream(byte[]) constructor.
 
 
一个测试:
public static void main(String[] args) throws Exception {

		short t = (short) 0xaced;//copy from java.io.ObjectStreamConstants.STREAM_MAGIC
		System.out.println(0xaced);
		
		//44269写入到byte[] = -84,-19,0,5,
		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
		ObjectOutputStream out = new ObjectOutputStream(buffer);
		out.writeShort(t);
		
		byte[] data = buffer.toByteArray();
		for(byte b:data) {
			System.out.print(b+",");
		}
		System.out.println();
		
		String text= new String(data);
		System.out.println(text);		// 输出	��
		data = text.getBytes();
		
		for(byte b:data) {
			System.out.print(b+",");	// 输出 -17,-65,-67,-17,-65,-67,0,5,
		}
	 
	}
 
 
 
 
分享到:
评论

相关推荐

    Android多点触控技术实战 针对图片自由缩放和移动

    【Android多点触控技术实战】在Android应用开发中,多点触控技术是一项重要的交互设计,它使得用户可以通过两个或更多的手指同时操作屏幕,从而实现更丰富的交互体验。在这个场景下,我们专注于如何实现图片的自由...

    java概念题汇总.pdf

    3. 异常处理:文件中提及了“Exception”、“InterruptedException”、“StreamCorruptedException”,这些都是Java异常处理的一部分。在Java中,异常处理通过“try”、“catch”、“finally”和“throw”、“throws...

    串行化保存和读取数据示例.zip

    8. **反序列化异常处理**:在进行反串行化时,务必准备好处理可能的异常,例如`InvalidClassException`、`StreamCorruptedException`等。 9. **数据格式兼容性**:如果你的应用需要跨平台或跨语言,选择一种通用的...

    中科软,文思 面试题

    当使用`ObjectOutputStream`向文件中多次追加对象时,可能导致`StreamCorruptedException`异常。这是因为序列化过程中会为每个对象写入一个标识头,而反序列化时只能识别一个标识头。解决方法是自定义`...

    基于springboot教育资源共享平台源码数据库文档.zip

    基于springboot教育资源共享平台源码数据库文档.zip

    视频笔记linux开发篇

    linux开发篇,配套视频:https://www.bilibili.com/list/474327672?sid=4493702&spm_id_from=333.999.0.0&desc=1

    readera-24-09-08plus2020.apk

    ReadEra 这个阅读应用能够打开下列任何格式的文档: EPUB, PDF, DOC, RTF, TXT, DJVU, FB2, MOBI, 和 CHM. 基本上来说,你可以用它阅读你的设备内存中的任何书籍或者文本文档。 这个应用与划分成章节的文档兼。,有一个书签功能,可以在你阅读的时候,自动保存你的进度。另外,它让你更改页面模式,从几种不同的主题中进行挑选(夜间,白天,棕黑色调,还有控制台)。

    STM32单片机控制舵机旋转

    软件环境:KEIL4 硬件环境:STM32单片机+舵机 控制原理:通过控制输出信号的占空比调节舵机旋转的角度

    基于springboot仓库管理系统源码数据库文档.zip

    基于springboot仓库管理系统源码数据库文档.zip

    酒店管理系统源码C++实现的毕业设计项目源码.zip

    酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 酒店管理系统源码C++实现的毕业设计项目源码.zip,酒店管理系统源码C++实现的毕业设计项目源码.zip个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。酒店管理系统源码C++实现的毕业设计项目源码.zip酒店管理系统源码C++实现的毕业设计项目源码.zip酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕

    58商铺全新UI试客试用平台网站源码

    58商铺全新UI试客试用平台网站源码

    基于SpringBoot+Vue的轻量级定时任务管理系统.zip

    springboot vue3前后端分离 基于SpringBoot+Vue的轻量级定时任务管理系统.zip

    毕业设计&课设_微博情感分析,用 flask 构建 restful api,含相关算法及数据文件.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    4D毫米波雷达点云数据处理方法研究.caj

    4D毫米波雷达点云数据处理方法研究.caj

    S M 2 2 5 8 X T量产工具

    S M 2 2 5 8 X T 量产工具供大家下载使用

    基于springboot的文物管理系统源码数据库文档.zip

    基于springboot的文物管理系统源码数据库文档.zip

    基于springboot的电影院售票管理系统源码数据库文档.zip

    基于springboot的电影院售票管理系统源码数据库文档.zip

    Javaweb仓库管理系统项目源码.zip

    基于Java web 实现的仓库管理系统源码,适用于初学者了解Java web的开发过程以及仓库管理系统的实现。

    美容美发项目,使用django框架,前后端一体化项目

    美容美发项目,使用django框架,前后端一体化项目

    2023年中国在线票务行业市场规模约为24.99亿元,挖掘市场新机遇

    在线票务:2023年中国在线票务行业市场规模约为24.99亿元,挖掘市场蓝海新机遇 在数字浪潮的席卷下,传统的票务销售模式正经历着前所未有的变革。纸质门票逐渐淡出人们的视野,取而代之的是便捷、高效的数字和移动票务。这一转变不仅为消费者带来了前所未有的购票体验,更为在线票务平台开辟了广阔的发展空间和市场机遇。随着国民经济的持续增长和文体娱乐行业的蓬勃发展,中国在线票务行业正站在时代的风口浪尖,等待着每一位有志之士的加入。那么,这片蓝海市场究竟蕴藏着怎样的潜力?又该如何把握机遇,实现突破?让我们一同探索。 市场概况: 近年来,中国在线票务行业市场规模持续扩大,展现出强劲的增长势头。据QYResearch数据显示,2023年中国在线票务行业市场规模约为24.99亿元,尽管受到宏观经济的影响,市场规模增速放缓,但整体趋势依然向好。这一增长主要得益于国民人均收入的不断提高、电影及演出行业的快速发展以及政府政策的支持。例如,2023年财政部、国家电影局发布的《关于阶段性免征国家电影事业发展专项资金政策的公告》,为电影行业注入了强劲动力,进而推动了在线票务市场规模的扩大。 技术创新与趋势: 技术进步

Global site tag (gtag.js) - Google Analytics