在使用IO流保存信息的过程中,我们如果想要将数据的类型也保存下来应该如何操作?
例如我想保存的是将 int num = 100 ,这个100存入到文件中,并且要求能够读取时,能恢复其是int型的100。应该怎么做?使用寿命样的方法?我们由此引出了序列化与反序列化。
序列化就是在保存数据时,保存数据的值和数据类型。
反序列化就是在恢复数据时,恢复数据的值和数据类型。
需要让某个对象支持序列化机制,那么必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
Serializable 是一个标记接口,里面没有方法。使用比较方便。
Externalizable 该方法有接口需要实现,因此我们一般使用Serializable
我们可以使用对象流,提供序列化与反序列化的方法
ObjectOutputStream 提供序列化
ObjectInputStream 提供反序列化
演示demo实现序列化与反序列化。
package IO流.OBJStream; import java.io.*; /** * @program:多线程和IO * @descripton: * @author:ZhengCheng * @create:2021/10/6-15:24 **/ public class ObjOutStream { public static void main(String[] args) throws IOException { String filepath = "d:\\data.dat"; ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filepath)); //序列化数据到file oos.writeInt(100); oos.writeBoolean(true); oos.writeChar('a'); oos.writeDouble(1.1); oos.writeUTF("多线程与IO"); //保存一个对象 oos.writeObject(new Drink("a",10.0f)); oos.close(); System.out.println("数据保存完毕(已序列化)"); } } //需要序列化只需要实现serializable接口 class Drink implements Serializable { private String name ; private float price ; public Drink(String name, float price) { this.name = name; this.price = price; } }
public class ObjInStream { public static void main(String[] args) throws IOException, ClassNotFoundException { String filepath = "d:\\data.dat"; ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filepath)); System.out.println(ois.readInt()); System.out.println(ois.readBoolean()); System.out.println(ois.readChar()); System.out.println(ois.readDouble()); System.out.println(ois.readUTF()); System.out.println(ois.readObject()); ois.close(); System.out.println("反序列化完毕"); } }
注意事项:
1.读写顺序要一致
2.要求序列化或反序列化的对象,需要实现Serializable接口
3.序列化的类中建议添加SerialVersionUID ,为了提高版本的兼容性
4.序列化时,默认将里面所有属性都进行序列化,但除了static和transient修饰的成员
5.序列化对象时,要求里面属性的类型也需要实现序列化接口
6.序列化具备可继承性,也就是如果某类已经实现序列化,则它的所有子类已经默认实现了序列化。