一、
* java中的序列化
* 值得对象的IO流 ObjectInputStream / ObjectOutputStream
* 序列化 - 将对象写出IO流 - ObjectOutputStream
* 反序列化 - 从IO流读取对象 - ObjectInputStream
* 序列话机制:可以是对象脱离程序的运行而独立存在/
*
* 使用场景 : 所有可以在网络上传输的对象, 必须都是可序列化的
* 所有需要保存在磁盘的对象 , 也必须都可以序列化的
* java中已存在的类基本上都是可序列化的
* 如何让自定义的类实现序列化 - 需要实现一个序列化标记接口
* Serializable - 序列化接口 - 实现此接口可以被序列化
public static void main(String[] args) throws IOException, ClassNotFoundException {
TestObject t1 = new TestObject("zhansan", 13);
System.out.println(t1);
TestObject t2 = new TestObject(new Student());
//将对象序列化到磁盘文件
ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("C:\\Users\\lvjinjian\\Desktop\\12.txt"));
System.out.println("写入完毕");
oss.writeObject(t1);//写出对象
//oss.writeObject(t2);//实例化自定义的类
//NotSerializableException 对象没有序列化异常
/**
* 当要序列化的对象,参数或返回值类型对应的类, 没有实现序列化接口时 就会抛出异常
*
* 写出是 字节码 文件
*/
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\lvjinjian\\Desktop\\12.txt"));
//ois.readObject()返回的是Object类型的 所以用Object接收
Object o=ois.readObject();//抛出类找不到异常 ClassNotFoundException
TestObject t3 =(TestObject) o;//向下转型
System.out.println("读取完毕");
System.out.println(t3);
oss.close();
ois.close();
}
}
//对象写出流测试
class TestObject implements Serializable {
private String name;
private int age;
private Student sud;//没有实例化时不会报错
public TestObject(String name, int age) {
this.name = name;
this.age = age;
}
//给Student单独创建构造方法 实例化
public TestObject(Student sud) {
this.sud = sud;
}
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;
}
@Override
public String toString() {
return "TestObject{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Student{
}
创建一个写出序列化——new ObjectOutputStream (FileOutpurStream file);
ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream ("C:\\Users\\lvjinjian\\Desktop\\12.txt"));
oss.wrietObject (对象名);——这个对象必须实现 Serializable 接口,否则无法序列化