之前不理解的序列化和反序列化看了之后秒懂!
如何让一个类在网络里面传输
序列化是什么?
序列化是要和io流在一起联系的,他的出现就是解决了类可以在网络里面传输。
重点:序列化就是保存数据的时候,要保存数据的值和数据的类型
例如:int i = 10; 你要保存的就是 10 和 int 这两个东西。
反序列化是什么?
重点:反序列化,就是你保存的数据的时候取出来的时候,是取他的值和数据类型的。
例如:你保存了一个Dog东西,取的时候他也要是一个Dog东西。
类要可以被序列化是有条件的
你的这个类必须实现两个接口
Serializable:一般是推荐使用这个接口的,他就是一个标记性的接口
Exetrnlizable:这个接口要现实他的方法,不推荐。
Java提供两个包装流/节点流针对于序列化的操作
ObjectOutputStream 序列化,从内存里面写对象到磁盘里面
public class Dome { public static void main(String[] args) throws IOException { //这里ObjectOutputStream 是包装流里面要存放一个节点流的 ObjectOutput objectOutput = new ObjectOutputStream(new FileOutputStream("D://a.bat")); //这里写的时候,这个100会自动装箱 objectOutput.writeInt(100); //这个是序列化一个对象 objectOutput.writeObject(new Dog("小黄")); //记得关闭流 objectOutput.close(); } } class Dog implements Serializable{ String name; public Dog(String name) { this.name = name; } }
ObjectInputStream 反序列化,从磁盘里面的文件读取到内存
public class Dome2 { public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D://a.bat")); //重点反序列化读取的数据必须和你写入序列化数据一致 int i = objectInputStream.readInt(); Object o = objectInputStream.readObject(); System.out.println(i); System.out.println(o); objectInputStream.close(); } }
序列化细节
#Java学习#1,读写顺序一致。
2,类必须要实现序列化接口。
3,类里面可以添加SerialVersionUID = 1L;属性提高版本的兼容性例如:你在序列化的类里面添加了一个属性,他就不会认为这个类是新的类,他会理解成为这个类在弄版本的变更。
4,序列化的时候,默认全部属性都序列化的除了static,transient修饰的属性。
5,实例化类的属性必须实现序列化的接口,如果父类实现了序列化接口,子类会自动继承过来的。