我正在尝试序列化和反序列化一个数组列表,其中包含一个对象:
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
in line paramDecoded = (ArrayList<HairBirt>) obj_in.readObject();
我不知道我做错了什么。你能给个小费吗?
Update:
解决:只需使用 HairBirt 的本机数组而不是 ArrayList,它就可以工作:
HairBirt[] list = new HairBirt[x];
代替
ArrayList<HairBirt> list = new ArrayList<HairBirt>();
感谢大家的帮助。
不要使用ByteArrayOutputStream.toString()
- 相反,使用toByteArray()
并对二进制数据进行 Base64 编码,将其转换为字符串,而不会丢失信息。
我强烈怀疑这是主要问题 - 序列化后丢失了数据。您可能还应该关闭或至少冲洗ObjectOutputStream
。我不知道在这种情况下这是否真的有什么作用,但这似乎是一个好主意。
我不相信 Java 中直接有任何 base64 支持(无论如何,在公共类中),但是您可以使用各种 3rd 方库,例如Apache Commons Codec 库中的一个.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)