序列化流与反序列化流

序列化流与反序列化流

对象可(反)序列化的条件

1.Serializable接口

要进行序列化和反序列的类必须实现该接口,给类添加一个标记。

当我们进行序列化与反序列化时,会检测该类是否有这个标记: 有:可以进行序列化与反序列化

没有:抛出NotSerializable接口Exception异常

进行反序列化时还必须存在对应的class文件,否则会抛出(ClassNotFoundException)

2.transient(瞬态关键字)

static :

静态优先于非静态加载到内存中(优先于对象进入内存);

被static修饰的成员变量不能被序列化与反序列化;

被transient修饰的成员变量也不能被序列化与反序列化,但是没有静态含义

序列号:每一个类被序列化时会自动生成一个序列号进行标记,当该类发生变化时,序列号也会发生变化。我们也可以自己定义序列号:

private static final long serialVersionUID=—;

序列化流

1.ObjectOutputStream

构造方法:

ObjectOutputStream(OutputStram out )

创建写入指定字节输出流的序列化流对象

特有的的成员方法: void writeObject (Object obj)

将指定对象写入序列化流,并最终写入字节输出流,并保存在硬盘;

2.使用步骤:

创建对象构造方法传递字节输出流;

使用方法writeobject将对象写入文件;

释放资源。

反序列化流

1.ObjectInputStream

构造方法:

ObjectInputStream(InputStream in )

创建从指定字节输入流读取的反序列化流对象

特有的的成员方法: void readObject (Object obj)

从反序列化中读取对象

2.使用步骤:

创建对象构造方法传递字节输入流;

使用方法readobject读取保存对象的文件;

释放资源和使用对象

代码练习

创建一个类用来提供序列化和反序列化创建对象

import java.io.Serializable;

public class Poem implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private String sentence;
    transient private int year;

    public Poem() {
    }

    public Poem(String name, String sentence, int year) {
        this.name = name;
        this.sentence = sentence;
        this.year = year;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSentence() {
        return this.sentence;
    }

    public void setSentence(String sentence) {
        this.sentence = sentence;
    }

    public int getYear() {
        return this.year;
    }

    public void setYear(int year) {
        this.year = year;
    }
}
View Code

练习序列化流与反序列化流

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class DemoObject06 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        File file = new File("Month\\src\\LearnIO2\\obj.txt");
        read_object(file);
    }

    public static void write_object(File file, Poem poem) throws IOException {
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream obs = new ObjectOutputStream(fos);
        obs.writeObject(poem);
        obs.close();
    }

    public static void read_object(File file) throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream obs = new ObjectInputStream(fis);
        Object o = obs.readObject();
        obs.close();
        Poem poem = (Poem)o;
        System.out.println(poem.getName() + "  " + poem.getSentence() + "  " );
    }
}

 

posted @ 2020-11-15 15:54  素色学习  阅读(129)  评论(0编辑  收藏  举报