序列化与反序列化
当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以。 把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计 算机平台存在相应的类就可以正常恢复为原来的对象。 serialVersionUID主要是为了解决对象反序列化的兼容性问题。
如果没有提供serialVersionUID,对象序列化后存到硬盘上之后,再增加或减少类的filed。这样,当反序列化时,就会出现Exception,造成不兼容问题。
但当serialVersionUID相同时,它就会将不一样的field以type的缺省值反序列化。这样就可以避开不兼容问题了
注意:使用对象流写入到文件是不仅要保证该对象是序列化的,而且该对象的成员对象也必须是序列化的
1 public static void main(String[] args) { 2 User user = new User(12,"123"); 3 System.out.println(serize(user)); 4 System.out.println("############"); 5 System.out.println(unserize(serize(user))); 6 User result = (User)unserize(serize(user)); 7 System.out.println(result.getName()); 8 9 } 10 11 public static byte[] serize(Object obj) { 12 13 ByteArrayOutputStream bos = null; 14 ObjectOutputStream oos = null; 15 try { 16 bos = new ByteArrayOutputStream(); 17 oos = new ObjectOutputStream(bos); 18 oos.writeObject(obj); 19 return bos.toByteArray(); 20 } catch (Exception e) { 21 } 22 return null; 23 } 24 25 public static Object unserize(byte[] bytes) { 26 try { 27 ByteArrayInputStream bis = new 28 ByteArrayInputStream(bytes); 29 ObjectInputStream ois = new ObjectInputStream(bis); 30 Object result = ois.readObject(); 31 return result; 32 } catch (IOException e) { 33 e.printStackTrace(); 34 } catch (ClassNotFoundException e) { 35 e.printStackTrace(); 36 } 37 return null; 38 } 39 40 class User implements Serializable{ 41 42 private static final long serialVersionUID = 1L; 43 private int age; 44 private String name; 45 46 public User(int age, String name) { 47 this.age = age; 48 this.name = name; 49 } 50 51 public int getAge() { 52 return age; 53 } 54 55 public String getName() { 56 return name; 57 } 58 59 }