java - 无法序列化/反序列化 ArrayList

标签 java serialization

我正在尝试序列化和反序列化一个包含对象的数组列表:

HairBirt param = new HairBirt();
param.setName("name");
param.setValue(2.3f);

HairBirt param2 = new HairBirt();
param2.setName("name2");
param2.setValue(2.4f);

ArrayList<HairBirt> list = new ArrayList<HairBirt>();

list.add(param);

list.add(param2);

ByteArrayOutputStream bos = null;
try {
    bos = new ByteArrayOutputStream();
    ObjectOutputStream obj_out = new ObjectOutputStream(bos);
    obj_out.writeObject(list);
} catch (IOException e) {
    e.printStackTrace();
}

String encoded = bos.toString();
try {
    encoded = URLEncoder.encode(encoded, "UTF-8");
} catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
}
System.out.print("The serialized output is: " + encoded);   

//DECODE

ArrayList<HairBirt> paramDecoded;

String myParam = null;
try {
    myParam = URLDecoder.decode(encoded, "UTF-8");
} catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
}
System.out.println("Got parameters");
ByteArrayInputStream bis = new ByteArrayInputStream(myParam.getBytes());

try {
    ObjectInputStream obj_in = new ObjectInputStream(bis);

    paramDecoded = (ArrayList<HairBirt>) obj_in.readObject();
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

HairList 对象也是一个可序列化的对象。

此代码执行返回以下错误:

java.io.InvalidClassException: java.util.ArrayList; local class incompatible: stream classdesc serialVersionUID = 8664875232659988799, local class serialVersionUID = 8683452581122892189

在线paramDecoded = (ArrayList<HairBirt>) obj_in.readObject();

我不知道我做错了什么。你能给点小费吗?

更新:

已解决: 只需使用 HairBirt 的 native 数组而不是 ArrayList 就可以了:

HairBirt[] list = new HairBirt[x];

代替

ArrayList<HairBirt> list = new ArrayList<HairBirt>();

谢谢大家的帮助。

最佳答案

不要使用 ByteArrayOutputStream.toString() - 相反,请使用 toByteArray() 并对二进制数据进行 base64 编码以将其转换为字符串而不丢失信息。

我强烈怀疑这是主要问题 - 您在序列化后丢失了数据。您可能还应该关闭或至少刷新 ObjectOutputStream。我不知道在这种情况下这是否真的有任何作用,但这似乎是个好主意。

我不认为 Java 直接支持任何 base64(无论如何在公共(public)类中),但是您可以使用各种第 3 方库,例如 the one in the Apache Commons Codec library .

关于java - 无法序列化/反序列化 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/678481/

相关文章:

c# - 为什么我无法再反序列化这些数据?

c# - 在没有数据库的情况下存储联系人/地址类型信息的最佳格式是什么?

Java 和 Windows - 通过 HTTPS 进行身份验证的问题

java - 我如何知道小程序是在浏览器中运行还是从 Eclipse 调用

c++ - 在 C++ 中从 CSV 获取数据的最快方法

dictionary - Realm中的HashMap序列化(移动数据库)

java - 为什么在反序列化期间从对象的类中删除变量不会引发异常?

java - 通过 JDBC 访问分层数据

java - 在 Eclipse 中传递 javac 参数

java - 如何防止在另一个线程的静态调用上创建对象副本