20170824 Java——序列化与反序列化

来源:互联网 发布:photoshop cc mac版本 编辑:程序博客网 时间:2024/05/21 09:04

目录(?)[-]

  1. 序列化
    1. 序列化是什么
    2. 如何实现对象序列化
    3. 实战练习
  2. Serializable
  3. 反序列化
  4. 总结
    1. 使用Reader读取文件内容1
    2. 使用Reader读取文件内容2

序列化

      • 序列化
        • 序列化是什么
        • 如何实现对象序列化
        • 实战练习
      • Serializable
      • 反序列化
      • 总结
        • 使用Reader读取文件内容1
        • 使用Reader读取文件内容2

序列化是什么?

将对象的状态存储到特定存储介质的过程。 
将Java对象转换为字节序列。 
这里写图片描述

如何实现对象序列化?

实现接口serializable 
这里写图片描述

实战练习:

public class BookManager {    //序列化:写入.   把对象写入二进制文件中,前提必须实现序列化接口    public static void serial(Book book){        ObjectOutputStream oos = null;        try {            oos = new ObjectOutputStream(new FileOutputStream("D:/IoFile/serial/book.txt"));            //实现序列化            oos.writeObject(book);            System.out.println("序列化成功");        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            try {                if(oos!=null){                    oos.flush();                    oos.close();                }            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    //反序列化:文件--->程序  输入     把二进制文件读取成对象    public static Book unSerial(){        ObjectInputStream ois =null;        Book book = null;        try {            ois = new ObjectInputStream(new FileInputStream("D:/IoFile/serial/book.txt"));            book = (Book) ois.readObject();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            try {                if(ois!=null){                    ois.close();                }            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        return book;    }    public static void main(String[] args) {//      Book book=new Book(1, "哈利波特");//      serial(book);        Book book=unSerial();        System.out.println(book.getName());    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

其实体类Book类实现Serializable接口:

import java.io.Serializable;/** * 序列化   * 作用:把对象保存至二进制文件 * @author 爱是与世界平行 * */public class Book implements Serializable{    private int id;    private String name;    public Book(int id, String name) {        super();        this.id = id;        this.name = name;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Serializable

  • 要想实现序列化(文件写入)或者反序列化(文件读取),必须实现Serializable接口。

  • 重写 readObject(ObjectInputStream in) 和 writeObject(ObjectOutputSteam 
    out) 方法,则调用这两个方法进行序列化或反序列化。

  • 带 readObject() 和 writeObject() 方法的序列化和反序列化 
    这两个方法可以在序列化和反序列化时定制用户的行为,即使它们被生命为private,但这丝毫不影响它们的作用。

  • 实际上,ObjectInputStream和ObjectOutputStream通过反射来寻找对象是否实现了这两个方法


反序列化

将文件中的内容读取出来。

这里写图片描述


总结

使用Reader读取文件内容1:

这里写图片描述

使用Reader读取文件内容2:

这里写图片描述