序列化与反序列化_28

序列化 / 反序列化:

常用于多台服务器之间进行java对象的数据传递

Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程。

序列化:是指把 程序中准备好的 java对象 永久的保存在磁盘中,这个过程其实是一个out动作。

  • ObjectOutputStream:
    * 通过在流中使用文件可以实现对象的持久存储。

  • 创建对象:
    * ObjectOutputStream(OutputStream out)

  • 常用方法:
    * void writeObject(Object obj)

  • 将指定的对象写入: ObjectOutputStream。

反序列化:是指 把磁盘中已经序列化好的文件 读取到程序中,恢复成java对象的动作,是一个in的过程。

  • ObjectInputStream:
    * 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

  • 创建对象
    * ObjectInputStream(InputStream in)

  • 常用方法
    * Object readObject()

  • 从 ObjectInputStream 读取对象。

实现序列化与反序列化(第一种方式)

不管序列化与反序列化都需要实现 Seriaizable 接口
第一步:创建一个封装类去实现 Seriaizable 接口:
  • Seriaizable 接口 只是用来标识这个hospital类需要进行序列化
class hospital implements Serializable {
    String name = "苏州广慈医院";
    int    num  = 88 ;
    String position = "doctor";

    @Override
    public String toString() {
        return "hospital{" +
                "name='" + name + '\'' +
                ", num=" + num +
                ", position='" + position + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }
}
第二步:序列化这个hospital类,将对象数据转换成二进制字节写入到文本文档中
public static void main(String[] args) {
        File file = new File("D://qwer//qwer.txt");
        serializeMethod(file);          //序列化
        deserializationMethod(file);    //反序列化
    }
private static void serializeMethod(File file) {

        hospital hp = new hospital("苏州广慈医院",88,"doctor");
        ObjectOutputStream out = null;
        try{
            out = new ObjectOutputStream(new FileOutputStream(file));
            out.writeObject(hp);
            out.close();
        }catch (IOException err){
            err.printStackTrace();
        }
    }

序列化的执行结果:将对象数据转换成机器可识别的二进制文件
在这里插入图片描述

第三步:反序列化这个磁盘中的文件,将其恢复成java对象并打印出来

public static void main(String[] args) {
        File file = new File("D://qwer//qwer.txt");
        serializeMethod(file);          //序列化
        deserializationMethod(file);    //反序列化
    }
private static void deserializationMethod(File file) {
        ObjectInputStream in = null;
        try{
            in = new ObjectInputStream(new FileInputStream(file));
            hospital hp = (hospital) in.readObject();
            System.out.println(hp.toString());
        }catch (IOException | ClassNotFoundException err){
            err.printStackTrace();
        }
    }

输出结果:

在这里插入图片描述

实现序列化与反序列化(第二种方式)

实现接口Externalizable, Externalizable 是 Serializable 的子类,由于实现了 Externalizable 接口,在 writeExternal() 里定义哪些属性可以被序列化,哪些属性不可以被序列化,在反序列化时获得的对象的属性也是被选择的.
第一步:创建一个封装类去实现 Externalizable接口:
/**
 * 测试的实体类
 */
class hospital02 implements Externalizable {
    private String name ;
    private int    num  ;
    private String position ;


    public hospital02(String name, int num, String position) {
        super();
        this.name =name;
        this.num = num;
        this.position=position;
    }
    public hospital02 (){
        super();
    }

    @Override
    public String toString() {
        return "hospital{" +
                "name='" + name + '\'' +
                ", num=" + num +
                ", position='" + position + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(num);
        out.writeObject(position);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        num= (int)in.readObject();
        position = (String) in.readObject();
    }
}
封装序列化与反序列化的相关操作
/**
 * 序列化与反序列化的相关操作
 */
class Operate{
    public void serializable(hospital02 hp) throws IOException,FileNotFoundException{
        ObjectOutputStream out =new ObjectOutputStream(new FileOutputStream("D://qwer//qwer02.txt"));
        out.writeObject(hp);
    }

    public hospital02 deSerializable() throws IOException, FileNotFoundException, ClassNotFoundException {
        ObjectInputStream in =new ObjectInputStream(new FileInputStream("D://qwer//qwer02.txt"));
        return (hospital02) in.readObject();

    }
}
实现序列化与反序列化
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        hospital02 hp = new hospital02("GC",86,"doctor");
        System.out.println("序列化之前对象hp的数据:"+hp.toString());

        Operate op =new Operate();
        op.serializable(hp);                    //序列化

        hospital02 hp02 = op.deSerializable();  //反序列化
        System.out.println("反序列化之后的hp02的数据:"+hp02.toString());


    }

执行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值