序列化和反序列化应该成对使用。我们对一个对象进行序列化之后得到的是这个对象对应的二进制数据,比如说我对一个字符串对象进行序列化之后得到是对象的二进制表示形式;如果你通过string的getBytes方法,可以得到字符串对象的数据的二进制表示形式。这两种二进制形式是不一样的,一个是对象的二进制表示,一个是对象的数据的二进制表示,前者包含了对象的数据之外还会包含一些额外的其他信息,比如说对象的序列化id等等。
因以上原因,我们就不能单单对一个没有经过序列化的二进制数据进行反序列化,
public class SerializeTest { public static void main(String args[]) { SerializeTest jt = new SerializeTest(); String s = "helloworld!"; byte[] bt = null; bt = s.getBytes(); ArrayList<String> list = new ArrayList<String>(); list=jt.getArrayList(bt);//这一行会出错。 } public ArrayList<String> getArrayList(byte[] bt) { ArrayList<String> list = new ArrayList<String>(); ObjectInputStream objIps; //注意这里,ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。问题就在这里,你是直接将byte[]数组传递过来,而这个byte数组不是使用ObjectOutputStream类写入的。所以问题解决的办法就是:用输出流得到byte[]数组。 try { objIps = new ObjectInputStream(new ByteArrayInputStream(bt)); list = (ArrayList<String>)objIps.readObject(); } catch (Exception e) { e.printStackTrace(); } return list; }
上面中就是对一个字符串对象的数据的byte字节数据进行反序列化,所以会报出标题错误。