java反序列化异常

java deserialize exception

我在程序开始时遇到反序列化问题。

public static void main(String[] args) throws IOException, ClassNotFoundException{

        Test object = new Test(); // Test implements Serializable

        //start
        deserialize();  

        //do something

        //end
        serialize(object);         
    }

public static void deserialize()
    {
        test object = null;

        try
          {
             FileInputStream file= new FileInputStream(".../Example.ser");
             if(file.read()!=-1) //the first time the file will be empty
             {
                 ObjectInputStream read= new ObjectInputStream(file); //here an exception is thrown the second time the program is started
                 object  = (Test) read.readObject();
                 object .printdata();
                 read.close();
                 file.close();
             }
             else
             {
                 file.close(); 
             }
          }catch(IOException i)
          {
             i.printStackTrace();
             return;
          }catch(ClassNotFoundException c)
          {
             c.printStackTrace();
             return;
          } 
    }

    public static void serialize(Test object)
    {   
        try
        {
           FileOutputStream file =
           new FileOutputStream(".../Example.ser");
           ObjectOutputStream write = new ObjectOutputStream(file );
           write .writeObject(object);
           write .close();
           file .close();
        }catch(IOException i)
        {
            i.printStackTrace();
        }
    }

如果切换序列化和反序列化,或者如果我在序列化之后调用反序列化,程序就会工作。 它第一次运行良好,但如果我第二次启动它,反序列化@ ObjectInputStream read= new ObjectInputStream(file);抛出流损坏的异常。

在程序启动时,必须反序列化并打印序列化文件,正如我所说,如果切换调用,然后将反序列化的调用复制回顶部,它可以工作,但如果它保持这样,则不会。第一次运行第二次就抛出异常

if(file.read()!=-1) //the first time the file will be empty

问题就在这里。您正在读取并丢弃文件的第一个字节,因此后续读取将不同步。去掉它。评论也不对。第一次 运行 此代码时,文件将 不存在 ,而不是空的。如果您仍然需要测试零长度文件,只需单独捕获 EOFException,因为您只读取一个对象。

如果这是一项学校作业并且您必须坚持 ObjectInputStream / ObjectOutputStream 连载,请阅读此答案。但是,如果你可以使用任何你想要的序列化格式,那么我建议使用非二进制格式,如 JSON.

像 json-io (https://github.com/jdereg/json-io) 这样的库允许您用一行将 Java 数据序列化为人类可读的 JSON 格式:

String json = JsonWriter.objectToJson(root);

并读取序列化的 JSON 数据:

Object root = JsonReader.jsonToJava(json);

能够查看并阅读序列化的内容对于调试此类情况非常有帮助。大多数现代 IDE 都可以轻松编辑 JSON 数据,还有一些网站,如:http://www.jsoneditoronline.org/,允许您直接在浏览器中编辑 JSON。