1. 序列化和反序列化java
将对象转换为字节序列的过程称为对象的序列化。 反过来,将字节序列恢复成对象的过程称为对象的反序列化。数据库
2. 为何要用序列化缓存
2.1当咱们须要将内存中的对象存储到一个文件\数据库中的时候 一般咱们须要将某些对象进行序列化,让它离开内存空间,入驻物理硬盘,以便长期保存,须要的时候在调取它。例如:缓存,咱们须要将缓存存储起来,须要的时候再将它取出来。 2.2须要在网络上传送对象的时候 当两个进程在进行远程通讯时,彼此时间须要发送数据,不管哪一种类型的数据,都会以二进制序列的形式在网络上传送。网络
3. 实例app
3.1建立User对象并实现Serializable接口测试
public class User implements Serializable{ /** 序列ID */ private static final long serialVersionUID = 8364239647574512618L; private Integer id; private String name;
3.2写测试代码this
package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.junit.Test; import model.User; public class TestUserSerializable { @Test public void test() throws InstantiationException, IllegalAccessException { //序列化 this.UserSerializable(); //反序列化 User user=this.UnUserSerialiable(); System.out.println(user); } /** * 序列化User对象 * * 1.经过反射建立对象 * * 2.建立对象输出流,调用writeObject(Object obj)方法 * * @throws InstantiationException * @throws IllegalAccessException */ public void UserSerializable() throws InstantiationException,IllegalAccessException{ User user=new User(); try { //经过反射建立User对象 Class<?> clazz=Class.forName("model.User"); user=(User) clazz.newInstance(); user.setId(1); user.setName("张三"); } catch (ClassNotFoundException e) { e.printStackTrace(); } ObjectOutputStream oos=null; try { StringBuffer path=new StringBuffer(); String str="E:\\Test\\"; File file=new File(str); if (!file.exists()) { file.mkdirs(); } path=path.append(str).append("User.txt"); //建立对象输出流 //将序列化的user存入E:\Test\User.txt oos=new ObjectOutputStream(new FileOutputStream(path.toString())); oos.writeObject(user); System.out.println("对象序列化成功!"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } public User UnUserSerialiable() throws InstantiationException,IllegalAccessException{ User user=new User(); ObjectInputStream ois=null; try { //反序列化 ois=new ObjectInputStream(new FileInputStream(new File("E:\\Test\\User.txt"))); try { user=(User) ois.readObject(); System.out.println("反序列化成功!"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return user; } }
4. serialVersionUID的做用code
Java的序列化机制是经过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,若是相同就认为是一致的,能够进行反序列化,不然就会出现序列化版本不一致的异常。对象
4.1经过Test单独测试UserSerializable(注释serialVersionUID)接口
4.2修改User属性,这时再反序列化