*对象序列化

1.对象序列化的意义及实现
2.了解对象输入,输出流的使用
3.理解transicnt关键字

1.对象序列化

所谓的对象序列化指的是将保存在堆内存中的对象数据转换为二进制数据流进行传输的操作。但是并不是所有类的对象可以进行序列化。
如果要被序列化的对象,那么其所在的类一定要实现java.io.Serializable接口。
但是这个接口里面并没有任何的操作方法存在,因为它是一个标识接口,表示一种能力。

Java有两个标识接口:一个是Clonable,用于对象克隆,一个是Serializable接口,用于对象序列化。

范例:定义一个可以被序列化对象的类。


@SuppressWarnings("serial")
class Book implements Serializable{//此对象可以被序列化
//压制了版本号的警告
    private String title;
    private double price;
    public Book(String title,double price){
        this.price=price;
        this.title=title;
    }
    @Override
    public String toString() {
        return "book=="+this.title+"price=="+this.title;
    }
}

这个类的对象就能实现对象序列化了。

实现序列化与反序列化

由于现在只有单机程序,所以现在将对象序列化到文件中,再通过文件反序列化到程序中。

序列化类:java.io.ObjectOutputStream(将对象变为指定格式的二进制类)

反序列化类:java.io.ObjectInputStream(可以将序列化的对象转换为对象内容)
构造方法都是装饰设计模式

范例:实现序列化对象操作


    public static void main(String[] args) throws Exception{
        ser();
    }

    public static void ser() throws Exception{//序列化方法
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("E:"+File.separator+"my.txt")))
        oos.writeObject(new Book("Java开发",79.8));
        oos.close();
    }

实现反序列化:


@SuppressWarnings("serial")
class Book implements Serializable{//此对象可以被序列化
//压制了版本号的警告
    private String title;
    private double price;
    public Book(String title,double price){
        this.price=price;
        this.title=title;
    }
    @Override
    public String toString() {
        return "book=="+this.title+"price=="+this.title;
    }
}

public class TestDemo{
    
    public static void main(String[] args) throws Exception{
        dser();
    }

    public static void ser() throws Exception{//序列化方法
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("E:"+File.separator+"my.ser")))
        oos.writeObject(new Book("Java开发",79.8));
        oos.close();
    }

    public static void dser() throws Exception{
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("E:"+File.separator+"my.ser"));
        Object obj=ois.readObject();
        Book book=(Book)obj;
        ois.close();
    }

}

在以后的实际开发之中,会由容器帮助用户自动完成以上的操作。

transient关键字

以上虽然实现了对象序列化,但是会发现序列化时将整个对象的所有属性内容进行保存, 如果现在某些属性的内容不需要被保存,就可以通过transient关键字保存。
private transient String title;

title属性将不能被序列化。但是大部分情况下不需要使用此关键字。

总结

对象序列化本身就是一个非常简单的概念,但是由于其在开发之中使用很广泛,所以现在编写代码中就必须清楚Serializable接口的作用,需要注意的是不是所有的类都需要被序列化,只有需要传输的对象才会需要使用序列化操作。

猜你喜欢

转载自blog.csdn.net/weixin_34055787/article/details/87040388