serialVersionUID的作用
个人理解:java序列化就是指把对象转化成字节序列,反序列化是指从字节序列中恢复java对象。
用eclipse写一个类实现serializable接口时,有两种选择,一是使用默认的序列号1L,另一个是自动生成。
这里“自动生成”是:根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。类A放在包1里和放在包2里生成的serialVersionUID是不同的。
public static InputStream objectToStream(java.lang.Object obj) throws Exception
{
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ByteArrayInputStream byteIn=null;
try
{
ObjectOutputStream oo = new ObjectOutputStream(byteOut);
oo.writeObject(obj);
oo.flush();
byteIn = new ByteArrayInputStream(byteOut.toByteArray());
byteOut.close();
oo.close();
}
catch (Exception e)
{
throw e;
}
return byteIn;
}
public static java.lang.Object streamToObject(InputStream input) throws Exception
{
java.lang.Object obj=new java.lang.Object();
try
{
ObjectInputStream oi = new ObjectInputStream(input);
obj = oi.readObject();
oi.close();
}
catch (Exception e)
{
throw e;
}
return obj;
}
上面两个方法分别实现了序列化和反序列化。
注意:
- 序列化和反序列化必须用相同的serialVersionUID
- 序列化时,对象的包信息也写在了字节序列里,所以反序列化时,对象的包路径要保持一致。比如原来将com.helloc001.test1序列化了,那反序列化时必须也存在com.helloc001.test1.
所以我觉得用默认的1L比较方便,用自动生成的serialVersionUID比较安全。