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。
我在程序开始时遇到反序列化问题。
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。