1. 数据流及其作用(了解) DataOutputStream:可以将内存中的基本数据类型的变量、String类型的变量写出到具体的文件中。 DataInputStream:将文件中保存的数据还原为内存中的基本数据类型的变量、String类型的变量。 2. 对象流及其作用 2.1 API: ObjectInputSteam ObjectOutputStream 2.2 作用: 可以读写基本数据类型的变量、引用数据类型的变量。 3. 对象的序列化机制是什么 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上, 或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。 4.如下两个过程使用的流: 序列化过程:(写的过程)使用ObjectOutputStream流实现。将内存中的Java对象保存在文件中或通过网络传输出去 反序列化过程:(读的过程)使用ObjectInputSteam流实现。将文件中的数据或网络传输过来的数据还原为内存中的Java对象 5.自定义类要想实现序列化机制,需要满足: ① 自定义类需要实现接口:Serializable ② 要求自定义类声明一个全局常量: static final long serialVersionUID = 42234234L; 用来唯一的标识当前的类。 ③ 要求自定义类的各个属性也必须是可序列化的。 > 对于基本数据类型的属性:默认就是可以序列化的 > 对于引用数据类型的属性:要求实现Serializable接口 6.注意点: ① 如果不声明全局常量serialVersionUID,系统会自动声明生成一个针对于当前类的serialVersionUID。 如果修改此类的话,会导致serialVersionUID变化,进而导致反序列化时,出现InvalidClassException异常。 ② 类中的属性如果声明为transient或static,则不会实现序列化。 代码
package chapter15_io_teacher.src.com.atguigu05.objectstream; import org.junit.Test; import java.io.*; /** * ClassName: ObjectInputOutputStreamTest * Description: * * @Author 尚硅谷-宋红康 * @Create 14:28 * @Version 1.0 */ public class ObjectInputOutputStreamTest { /* * 序列化过程:使用ObjectOutputStream流实现。将内存中的Java对象保存在文件中或通过网络传输出去 * */ @Test public void test1() throws IOException { //1. File file = new File("object.txt"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); //2.写出数据即为序列化的过程 oos.writeUTF("江山如此多娇,引无数英雄竞折腰"); oos.flush(); oos.writeObject("轻轻的我走了,正如我轻轻的来"); oos.flush(); oos.close(); } /* * 反序列化过程:使用ObjectInputSteam流实现。将文件中的数据或网络传输过来的数据还原为内存中的Java对象 * */ @Test public void test2() throws IOException, ClassNotFoundException { //1. File file = new File("object.txt"); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); //2. 读取文件中的对象(或反序列化的过程) String str1 = ois.readUTF(); System.out.println(str1); String str2 = (String) ois.readObject(); System.out.println(str2); //3. ois.close(); } //演示自定义类的对象的序列化和反序列化过程 //序列化过程: @Test public void test3() throws IOException { //1. File file = new File("object1.dat"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); //2.写出数据即为序列化的过程 Person p1 = new Person("Tom",12); oos.writeObject(p1); oos.flush(); Person p2 = new Person("Jerry",23,1001,new Account(2000)); oos.writeObject(p2); oos.flush(); //3. oos.close(); } //反序列化过程: @Test public void test4() throws IOException, ClassNotFoundException { //1. File file = new File("object1.dat"); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); //2. 读取文件中的对象(或反序列化的过程) Person person = (Person) ois.readObject(); System.out.println(person); Person person1 = (Person) ois.readObject(); System.out.println(person1); //3. ois.close(); } }
package chapter15_io_teacher.src.com.atguigu05.objectstream; import java.io.Serializable; /** * ClassName: Person * Description: * * @Author 尚硅谷-宋红康 * @Create 14:36 * @Version 1.0 */ public class Person implements Serializable { //Serializable:属于一个标识接口 String name; int age; int id; Account acct; static final long serialVersionUID = 422334254234L; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name, int age, int id) { this.name = name; this.age = age; this.id = id; } public Person(String name, int age, int id, Account acct) { this.name = name; this.age = age; this.id = id; this.acct = acct; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } // @Override // public String toString() { // return "Person{" + // "name='" + name + '\'' + // ", age=" + age + // '}'; // } // @Override // public String toString() { // return "Person{" + // "name='" + name + '\'' + // ", age=" + age + // ", id=" + id + // '}'; // } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", id=" + id + ", acct=" + acct + '}'; } } class Account implements Serializable{ double balance; static final long serialVersionUID = 422234L; public Account(double balance) { this.balance = balance; } @Override public String toString() { return "Account{" + "balance=" + balance + '}'; } }