2012-02-09 53 views
4

在串行化对象中读取时出现错误(java.io.StreamCorruptedException:invalid type code:00)。下面是实现Serializable类:Java中的序列化,无效的类型代码00

package guts; 

import cc.mallet.classify.*; 
import java.io.*; 


public class NaiveBayesWithID implements Serializable { 

private NaiveBayes nb; 
private static final long serialVersionUID = 1; 
    private static final int CURRENT_SERIAL_VERSION = 1; 

public NaiveBayesWithID(NaiveBayes nb) { 
this.nb = nb; 
} 
public NaiveBayesWithID(){ 
this.nb = null; 
} 

    public void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
    int version = in.readInt(); 
    if (version != CURRENT_SERIAL_VERSION) 
     throw new ClassNotFoundException("Mismatched NaiveBayesTrainer versions: wanted " + 
       CURRENT_SERIAL_VERSION + ", got " + 
       version); 

    //default selections for the kind of Estimator used 

    NaiveBayesWithID test = (NaiveBayesWithID) in.readObject(); 
    // nb = test.returnNB(); 
    } 

    public void writeObject(ObjectOutputStream out) throws IOException 
    { 
    out.writeInt(CURRENT_SERIAL_VERSION); 

    //default selections for the kind of Estimator used 
    out.writeObject(this); 
    } 

    public NaiveBayes returnNB(){ 
    return nb; 
    } 

    public void setNB(NaiveBayes nb){ 
     this.nb = nb; 
    } 

} 

,这里是堆栈跟踪:

java.io.StreamCorruptedException: invalid type code: 00 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1355) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 
at java.util.ArrayList.readObject(ArrayList.java:593) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 
at cc.mallet.pipe.SerialPipes.readObject(SerialPipes.java:142) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 
at guts.NaiveBayesWithID.readObject(NaiveBayesWithID.java:29) 
at controllers.Application.predict(Application.java:481) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:408) 
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:403) 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:176) 
at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:169) 
at play.Invoker$Invocation.run(Invoker.java:187) 
at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:149) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:680) 

有谁知道我怎么可以得到错误的详细信息?或者java期待哪个对象?

+0

Duplicate http://stackoverflow.com/questions/2234406/exception-java-io-streamcorruptedexception-invalid-type-code-00 – 2012-02-09 19:02:10

+0

这并没有解决问题。你能否提供解释为什么它应该? – user1189582 2012-02-09 19:06:12

回答

5

您已经实现了一个递归writeObject方法:当你写一个实例到输出流,它调用writeObject方法,其中写道:一个int,然后写入对象输出流,它写一个int等。

serialVersionUID字段的目标是检查对象是否兼容。它由序列化机制本地完成。除非在类更改时更改serialVersionUID值,否则不必执行任何操作。

+0

我已经改变了读取和写入的方法,以便它现在不写入或读取CURRENT_SERIAL_VERSION,并且我得到完全相同的错误 – user1189582 2012-02-09 19:13:03

+0

这不是导致问题的字段。这是'这个'。不要实现任何writeObject或readObject方法。如果没有这些方法,序列化机制将会毫无问题地写入对象。 – 2012-02-09 19:15:08

+0

我刚刚尝试将这些方法从对象输出流中直接读取和写入对象,发生同样的方法。有什么其他原因可能导致它? – user1189582 2012-02-09 19:25:25

-1

运行得到答案:

package so.java9217010; 
import java.io.*; 

public class SerializeMe implements Serializable{ 


    private String foo; 
    private static final long serialVersionUID = 1; 
    private static final int CURRENT_SERIAL_VERSION = 1; 

    public SerializeMe(String foo) { 
     this.foo = foo; 
    } 
    public SerializeMe(){ 
    } 

    public SerializeMe readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
     int version = in.readInt(); 
     if (version != CURRENT_SERIAL_VERSION) 
      throw new ClassNotFoundException("Mismatched NaiveBayesTrainer versions: wanted " + 
        CURRENT_SERIAL_VERSION + ", got " + 
        version); 

     //default selections for the kind of Estimator used 

     return (SerializeMe) in.readObject(); 
     // nb = test.returnNB(); 
    } 

    public void writeObject(ObjectOutputStream out) throws IOException 
    { 
     out.writeInt(CURRENT_SERIAL_VERSION); 

     //default selections for the kind of Estimator used 
     out.writeObject(this); 
    } 

    public String returnNB(){ 
     return foo; 
    } 

    public void setNB(String foo){ 
     this.foo = foo; 
    } 
    public static void main(String[] args) throws Exception { 
     SerializeMe o = new SerializeMe("hello"); 
     ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
     ObjectOutputStream oout = new ObjectOutputStream(bout); 

     o.writeObject(oout); 
     oout.flush(); 
     byte[] buff = bout.toByteArray(); 

     ByteArrayInputStream bin = new ByteArrayInputStream(buff); 
     ObjectInputStream oin = new ObjectInputStream(bin); 
     SerializeMe ro = o.readObject(oin); 
     System.out.format(
       "got: %s -- the problem is most likely in the library you are using ...\n", 
         ro.returnNB()); 
    } 
} 
+0

这不是一个答案。考虑有人从智能手机上阅读无法运行代码;那么这个答案不会帮助他们。 – 2012-02-28 09:49:53

+1

然后阅读代码... – alphazero 2012-03-02 17:14:06

1

如果JVM找不到类,当你试图读取序列化对象,将产生此异常。检查更新的jar/class文件在类路径中是否可用等。

如果从命令行运行mallet,它可能是从下载的发行版中查看解压缩的mallet jar和类文件,而不是在您下载的源代码库中创建的漂亮的新类文件中。

不要觉得太糟糕 - 我已经看到这种情况发生在其他人身上,并且自己做了(虽然我得到了更多信息“ClassNotFoundException”帮我弄明白:)

0

来到这里找到Mallet分类器反序列化的解决方案。最后,我的问题是我在一个Eclipse项目中训练并序列化模型,并试图在另一个Eclipse项目中反序列化。序列化对象中的一个类(在我创建的类中)只在前一个项目的类路径上,而不在后一个的类路径上。

+1

这不提供问题的答案。一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你将能够[评论任何职位](http://stackoverflow.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 所以你的意思是最初的问题是“有人知道我怎么能得到关于错误的更多信息吗?或者java期望的是什么对象?” - [来自评论](/ review/low-quality-posts/12348168) – Misha 2016-05-14 07:21:34

+0

所以答案应该是关于如何获得有关错误的更多信息?或者提问者的*真实*目标是解决问题?我的答案为解决真正的问题提供了解决方案。对不起。 – aburkov 2016-05-14 19:51:30

相关问题