一. 为什么要序列化?
上一章节写入文件的员工列表信息数据:
通过 DataOutputStream 和 DataInputStream ,发现太复杂了,需要固定的格式进行处理, 当数据信息复杂时,就疯了。
我们发现,员工的信息可以封装成一个对象,如 Person 对象, 该对象里面有 id,name,sex,age,desc 属性。
public class Person { private int id; private String name; private char sex; private int age; private String desc; public Person() { } public Person(int id, String name, char sex, int age, String desc) { this.id = id; this.name = name; this.sex = sex; this.age = age; this.desc = desc; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + ", sex=" + sex + ", age=" + age + ", desc='" + desc + '\'' + '}'; } }
我们存储时,能直接存储对象就好了, 取数据时,直接取对象, 方便操作。
这种形式,其实就是序列化。
序列化是将对象存储到文件里面, 反序列化是将文件转换成对象。
序列化和反序列化所需要的对象为 ObjectOutputStream 和 ObjectInputStream.
二. 序列化 ObjectOutputStream
二.一 方法
二.一.一 构造方法
二.一.一.一 方法
二.一.一.二 演示
@Test public void objConTest() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"data2.txt"); //传入 outputStream ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file)); }
二.一.二 写入方法
对于 ObjectOutputStream 对象,只需要记住 writeObject() 方法即可。
二.二 演示 ObjectOutputStream
在序列化对象之前, 必须要保证 那个实体类, 即 Person 类,实现了 java.io.Serializable 接口, 否则会抛出异常的。
public class Person implements Serializable { }
二.二.一 写入 单个对象
@Test public void write1Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"data2.txt"); ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file)); Person person=new Person(1,"两个蝴蝶飞",'男',24,"一个快乐的程序员"); //如果没有序列化,会报错。 objectOutputStream.writeObject(person); objectOutputStream.close(); }
大概可以猜测是三部分, 第一部分是 类全限定名称, 第二部分是属性, 第三部分是 数据。
二.二.二 写入集合对象
同样是 writeObject ()方法处理。
@Test public void write2Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"data3.txt"); ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file)); Person person1=new Person(1,"两个蝴蝶飞1",'男',24,"一个快乐的程序员1"); Person person2=new Person(2,"两个蝴蝶飞2",'男',24,"一个快乐的程序员2"); Person person3=new Person(3,"两个蝴蝶飞3",'男',24,"一个快乐的程序员3"); Person person4=new Person(4,"两个蝴蝶飞4",'男',24,"一个快乐的程序员4"); Person[] ps=new Person[]{person1,person2,person3,person4}; //如果没有序列化,会报错。 objectOutputStream.writeObject(ps); objectOutputStream.close(); }
运行程序,查看 data3.txt
我们虽然看不懂,但 ObjectInputStream 却能看懂,能解析。