码迷,mamicode.com
首页 > 编程语言 > 详细

【Java】对象序列化中出现的java.io.StreamCorruptedException异常

时间:2015-06-10 15:52:19      阅读:1092      评论:0      收藏:0      [点我收藏+]

标签:java 序列化 java.io.streamcorruptedexception

今天在试验对象序列化,看到在类继承了Serializable接口,还有两个函数会在对象序列化及反序列化时默认自动执行,分别是writeObject和readObject。


进行了简单的试验,发现在在程序执行过程中出现了下述异常:

java.io.StreamCorruptedException: invalid type code: 00

at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1520)

at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1725)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)

at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1956)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)

at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)

at sm.test.TestSerializeDemo.test(TestSerializeDemo.java:59)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)

at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)

at org.junit.runners.ParentRunner.run(ParentRunner.java:300)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)


感觉非常奇怪,上网去查了一些资料,大体都是和socket通信相关的。但是我的测试里根本没有用到socket,大体的思路是在序列化的时候会向流中写一个标志。


经过排查发现我在要进行序列化的类中,只实现了writeObject这一个方法,并没有实现readObject方法。当我把readObject方法也写上之后,再运行代码发现没有异常了。


总结:要想使用

private void writeObject(java.io.ObjectOutputStream out) throws IOException

private void readObject(java.io.ObjectInputStream in) throws IOException

这两个自动执行的方法,要成对出现,要不就都没有,要不就都有,否则会出现奇怪的异常。

【Java】对象序列化中出现的java.io.StreamCorruptedException异常

标签:java 序列化 java.io.streamcorruptedexception

原文地址:http://mingsuper.blog.51cto.com/8269088/1660395

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!