static静态关键字:静态关键字优先于非静态加载到内存中(静态优先于对象进入到内存中) 被static修饰的成员变量不能被序列化因为序列化的都是对象 private static int age; oos.writeObject(new Person("TT",18)); System.out.println(o); //Person{name='null', age=0}为什么输出0 静态的是不能被序列化的 transient关键字:瞬态关键字 被transient修饰的成员变量不能被序列化(不能以对象流被ObjectInputStream和ObjectInputStream的形式读取和写入) 跟上面static作用是一样的
Person类
public class Person implements Serializable { //序列化和反序列化的类要实现标记型接口
private static String name; 注意这里加了静态关键字static
private transient int age; 注意这里加了瞬态关键字transient
先序列化:写入对象 output
public class Demo01ObjectOutputStream {
public static void main(String[] args) throws IOException {
// 1、创建ObjectOutputStream对象,构造方法中传递字节输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\百度网盘下载\\a.txt"));
// 2、使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
oos.writeObject(new Person("TT",18)); //二进制存储无法直接看
// 3、释放资源
oos.close();
}
}
反序列化 读取对象 input
public class Demo02ObjectInputStream {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1、创建ObjectInputStream对象,构造方法中传递字节输入流
ObjectInputStream ois= new ObjectInputStream(new FileInputStream("D:\\百度网盘下载\\a.txt"));
//2、使用ObjectInputStream对象中的方法readObject读取保存对象的文件
Object o = ois.readObject();
// 3、释放资源
ois.close();
// 4、使用读取出来的对象(打印)
System.out.println(o);//Person{name='TT', age=18}
Person p = (Person)o; //强制转换为Person类
System.out.println(p.getName()+p.getAge());//TT18
}
}
输出:
Person{name='null', age=0}
null0