序列化和反序列化:
1、序列化就是在保存数据时,保存数据的值和数据类型
2、反序列化就是在恢复数据时,恢复数据的值和数据类型
3、需要让某个对象支持序列化机制,则必须让其是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:Serializable、Externalizable;一般使用Serializable
ObjectOutputStream:
public class Study {
@SuppressWarnings({"all"})
public static void main(String[] args) throws Exception {
String filePath = "d:\\text.tex";
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));
objectOutputStream.write(100);//int->Integer(实现了serializable)
objectOutputStream.writeBoolean(true);//boolean->Boolean
objectOutputStream.writeChar('a');//char->character
objectOutputStream.writeDouble(3.5);//double->Double
objectOutputStream.writeUTF("hello");//String
objectOutputStream.writeObject(new Person("jack"));
objectOutputStream.close();
System.out.println("成功写入...");
}
}
class Person implements Serializable{
private String name;
public Person(String name) {
this.name = name;
}
}
ObjectInputStream:
public class Study {
@SuppressWarnings({"all"})
public static void main(String[] args) throws Exception {
String filePath = "d:\\text.tex";
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filePath));
//反序列化的顺序需要和保存数据时的顺序要一致,否则会发生异常
System.out.println(objectInputStream.readInt());
System.out.println(objectInputStream.readBoolean());
System.out.println(objectInputStream.readChar());
System.out.println(objectInputStream.readDouble());
System.out.println(objectInputStream.readUTF());
Object person = objectInputStream.readObject();
System.out.println(person);//底层Object->Person
//1.如果想要调用Person的特有方法,需要向下转型
//2.需要将Person类的定义放到可以(引用)的地方
objectInputStream.close();
System.out.println("读取成功...");
}
}
注意事项:
1、读写顺序要一致
2、要求实现序列化或反序列化的对象,需要实现Serializable
3、序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
4、序列化对象时,默认将里面所有的属性都进行序列化,但除了static或transient修饰的成员
5、序列化对象时,要求里面属性的类型也需要实现序列化接口
6、序列化具备可继承性,也就是如果某类已经实现了序列化,则它的子类也已经默认实现了序列化