序列化基本概念
所有的项目开发一定都有序列化的概念存在
序列化的基本实现
所谓的对象序列化指的是将内存中保存的对象变为二进制数据流的形式进行传输,或其是将其保存在文本中。但是并不意味着所有类对象都可以序列化,严格来讲,需要被序列化的类对象往往需要传输使用,同时这个类必须实现java.io.Serializable接口,但是这个接口并没有任何的方法定义,所有只是一个标识接口
范例:定义可以被序列化对象的类
1 package cn.Tony.demo; 2 3 import java.io.Serializable; 4 5 @SuppressWarnings("serial") 6 class Person implements Serializable{ 7 private String name; 8 private int age; 9 public Person(String name,int age) { 10 this.name=name; 11 this.age=age; 12 } 13 @Override 14 public String toString() { 15 return "Person [name=" + name + ", age=" + age + "]"; 16 } 17 } 18 19 public class TestDemo{ 20 public static void main(String[] args) throws Exception { 21 22 } 23 }
序列化对象时所需要保持的就是对象中的一个属性,所有默认情况下对象的属性将被转为二进制数据流
序列化与反序列化操作
如果要想实现序列化和反序列化的对象操作,在java.io提供有两个处理类:ObjectOutputStream ObjectInputStream 这两个类的定义结构以及各自的构造方法:
范例:实现对象序列化
1 package cn.Tony.demo; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.ObjectInputStream; 7 import java.io.ObjectOutputStream; 8 import java.io.Serializable; 9 10 public class TestDemo{ 11 public static final File FILE=new File("D:"+File.separator+"IO"+File.separator+"data.txt"); 12 public static void main(String[] args) throws Exception { 13 ser(new Person("张三",20)); 14 dser(); 15 } 16 public static void ser(Object obj)throws Exception {//专门负责实例化对象, 17 ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(FILE)); 18 oos.writeObject(obj); 19 oos.close(); 20 } 21 public static void dser()throws Exception{ 22 ObjectInputStream ois=new ObjectInputStream(new FileInputStream(FILE)); 23 System.out.println(ois.readObject()); 24 ois.close(); 25 } 26 } 27 @SuppressWarnings("serial") 28 class Person implements Serializable{ 29 private String name; 30 private int age; 31 public Person(String name,int age) { 32 this.name=name; 33 this.age=age; 34 } 35 @Override 36 public String toString() { 37 return "Person [name=" + name + ", age=" + age + "]"; 38 } 39 }
在以后实际的项目开发中,你们根本不需要知道实现序列化,和反序列化操作。
transient关键字()
实际上序列化的处理在java.io包里面有两类。Serializable是使用最多的序列化接口,那么这种操作采用自动化模式完成,默认情况下所有的属性都会被序列化,还有一个Externalizable接口是需要用户自己来动手序列化处理,一般很少使用
但是由于默认情况Serializable会将对象中的所有属性进行保存,如果现在某些属性不希望被保存了,可以使用transient关键字。
范例:使用transient
1 private transient String name; 2 private int age;
不过大部分情况下使用序列化往往在简单java类上较多,其他类上使用序列化的操作模式相对较少,而如果简单java类很少使用transient了