java基础序--列化和反序列化
一、什么是序列化和反序列化:
序列化:是指把java堆内存中的对象转换成字节(二进制流)的过程。也就是通过某种方式将java对象存储在磁盘内存中,这个过程称为序列化
反序列化:是把磁盘上的对象转恢复成java对象的过程。
二、序列化和反序列化优点:
1、分布式系统中,需要把对象在网络传输,需要将对象转换成二进制流形式,需要共享的javabean对象都需要进行序列化。
2、服务器钝化,服务器发现某些对象好久没有活动,服务器就会将某些对象存储在本地内存中,需要的时候去内存中寻找,然后反序列化成java对象,节省服务器内存。
总结:①、实现了数据的持久化,通过序列化保存在本地硬盘上。②、利用序列化实现了远程通信。
三、序列化的必要条件:
1、需要实现Java.lang.Serializable 接口,java中大多类都实现类改接口。例:String Integer
2、断层会判断,当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断
3、jdk中的api:
ObjectOutputStream 中的 writeObject() 方法进行序列化操作
ObjectInputStream 中的readObject() 方法进行反序列化操作
javabean 如果不实现 java.io.Serializable 接口
demo:
package com.liuxn.Serialization.javaBean; import java.io.Serializable; /** * Created by Administrator on 2018/6/13. * 创建一个javabean 实现 Serializable 接口 */ public class User implements Serializable { //需要进行序列化的字段 private String name; private int age; transient private String className;//不需要进行序列化的字段 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public void setAge(int age) { this.age = age; } // public User(String name, int age) { // this.name = name; // this.age = age; // } // // // public User() { // } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", className='" + className + '\'' + '}'; } }
package com.liuxn.Serialization.test; import com.liuxn.Serialization.javaBean.User; import java.io.*; /** * Created by Administrator on 2018/6/13. * * 用于测试序列化和反序列化 测试类 */ public class TestSerialization { public static void main(String[] args) { /** * 使用ObjectOutputStream实现序列化 */ User user = new User(); user.setAge(10); user.setName("小明"); System.out.println(user); ObjectOutputStream oos = null; try { OutputStream op = new FileOutputStream("F:\\360WiFi"+ File.separator+"a.txt"); oos = new ObjectOutputStream(op); oos.writeObject(user); oos.close(); } catch (IOException e) { e.printStackTrace(); } /** * ObjectInputStream 实现反序列化 */ try { InputStream in = new FileInputStream("F:\\360WiFi"+ File.separator+"a.txt"); ObjectInputStream os = new ObjectInputStream(in); byte[] buffer = new byte[10]; int len = -1; User u = (User) os.readObject(); System.out.println("反序列化:"); System.out.println(u); os.close(); }catch (Exception e){ e.printStackTrace(); } } }
//输出结果: User{name='小明', age=10} 反序列化:User{name='小明', age=10}
在序列化时,如果javabean完成序列化后,修改javabean,在次进行反序列化会出现以下问题:
解决:
在javabean中条添加 serialVersionUID 固定版本。
private static final long serialVersionUID = 1L;
javabean