序列化流与反序列化流
对象可(反)序列化的条件
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() + " " ); } }