无法序列化/反序列化ArrayList

我正在尝试使用内部对象序列化和反序列化数组列表:

HairBirt param = new HairBirt(); param.setName("name"); param.setValue(2.3f); HairBirt param2 = new HairBirt(); param2.setName("name2"); param2.setValue(2.4f); ArrayList list = new ArrayList(); 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 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) 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) obj_in.readObject();

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

更新:

已解决:刚刚使用HairBirt的本机数组而不是ArrayList,它可以工作:

 HairBirt[] list = new HairBirt[x]; 

代替

 ArrayList list = new ArrayList(); 

感谢大家的帮助。

不要使用ByteArrayOutputStream.toString() – 而是使用toByteArray()和base64编码该二进制数据将其转换为字符串而不丢失信息。

我强烈怀疑这是主要问题 – 您在序列化后丢失了数据。 您可能还应关闭或至少刷新ObjectOutputStream 。 我不知道在这种情况下是否实际上做了什么,但这似乎是一个好主意。

我不相信Java中直接支持任何base64(无论如何都是公共类),但是你可以使用各种第三方库,例如Apache Commons Codec库中的库 。

您是否尝试通过在自定义类中声明自己的serialVersionUID来覆盖此行为?

您是否有特定的理由进行序列化字符串的额外步骤? 通常,您只需通过ObjectOutputStream反序列化。