随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

序列化:

所谓的对象序列化指的是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或者是网络传输,

对象序列化是一个重要的概念,但是在开发之中对象序列化并不麻烦,因为序列化的时候用户只需要标注可序列化的对象,然后系统会帮助用户进行序列化;

但是并不是所有的对象都可以被序列化,在java中有一个强制的要求:

  如果要序列化的类,都必须实现 java.io.Serializable父接口,作为序列化的标记。

 Serializable接口中没有任何方法,因为它描述的是一种类的能力,在java中有两个描述类能力的接口,一个是Serializable,一个是cloneable。

可以被序列化的类:

import java.io.Serializable;

@SuppressWarnings("serial")
class Person implements Serializable{   // Serializable接口中没有任何方法,其作用是描述类的能力,和克隆接口一样
    // 此时 Person类可以被序列化
//    private static final long serialVersionUID = 1L;    // 为了防止反序列化,一般会加上一个序列号,但是意义不大,因为可以选择@SuppressWarnings("serial")压制
    private String name;
    int age;
    public Person(String name,int age){
        this.age = age;
        this.name = name;
    }
}

此时Person类产生的每一个对象都可以被序列化,实现二进制的数据传输。

 

 

序列化和反序列化:

类名称: 序列化:ObjectOutputStream(JDK 1.1) 反序列化:ObjectInputStream(JDK 1.1)
类定义:
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants

 

public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants

 

类名称: 序列化:ObjectOutputStream(JDK 1.1) 反序列化:ObjectInputStream(JDK 1.1)
构造方法:
public ObjectInputStream​(InputStream in) throws IOException

 

protected ObjectOutputStream() throws IOException,SecurityException

 

操作方法:
public final void writeObject​(Object obj) throws IOException
public final Object readObject() throws IOExceptionClassNotFoundException

代码实现:

import java.io.*;

@SuppressWarnings("serial")
class Person implements Serializable{   // Serializable接口中没有任何方法,其作用是描述类的能力,和克隆接口一样
    // 此时 Person类可以被序列化
//    private static final long serialVersionUID = 1L;    // 为了防止反序列化,一般会加上一个序列号,但是意义不大,因为可以选择@SuppressWarnings("serial")压制
    private String name;
    int age;
    public Person(String name,int age){
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class MAIN {
    private static final File SAVE_FILE = new File("D:" + File.separator + "CDLM.Person");
    public static void main(String[] args) throws Exception{
        saveObject(new Person("张三",18));
        System.out.println(loadObject());
    }
    public static void saveObject(Object obj) throws Exception{
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
        oos.writeObject(obj);   // 序列化
        oos.close();
    }
    public static Object loadObject() throws Exception{
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
        Object obj = ois.readObject();  // 反序列化
        ois.close();
        return obj;
    }
}

在java中的对象序列化与反序列化必须使用内部提供的对象操作流,因为这里面牵扯到二进制的格式,所以不能够自定义处理,另外如果想实现一组对象的序列化,则可以使用对象数组完成。

在很多的实际开发项目中,开发者很少能够见到ObjectOutputStream和ObjectInputStream的直接操作,因为会有一些程序类(容器)帮助开发者自动实现。

protected ObjectInputStream()
posted on 2022-02-21 10:22  时间完全不够用啊  阅读(446)  评论(0编辑  收藏  举报