序列化与反序列化

一、序列化的概念
序列化:首先,用日常生活中的例子来理解一下序列化。在我们日常生活中,运输一个整个的汽车总是不方便的,所以我们会把汽车拆开,当汽车变成一个个零件的时候,我们的运输任务也会轻松很多。那么在我们敲代码的时候,我们会用各种方式保存数据,那么java会提供给你自动的一种保存数据的方法,就是我们所说的序列化。
正确的说:序列化是将数据结构或对象转换成二进制串的过程,简单点说序列化就是就是将数据分解成字节流,以便存储在文件中或在网络上传输的过程。反序列化就是打开字节流并重构对象。

二、序列化的作用
1、序列化是为了保存内存中的各种对象的状态,并且可以把保存的对象状态在读出来。
2、可以实现数据的持久化,在MVC模式中很有作用
3、对象数据的远程通信使用序列化与反序列化
4、对象序列化的作用:就是在传递和保存对象时,保证对象的完整性和可传递性。比如把一个对象保存成一个文件的时候需要实现序列化接口。
三、应用场景
1、当你想把内存中的对象保存到一个文件中或数据库中的时候
2、当你想用套接字在网络上传输对象的时候
3、当你想通过RMI传输对象的时候
附加:Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
四、序列化的具体实现
1、写一个POJO类,实现Serializable接口。实现了Serializable接口的类为保证serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。

import java.io.Serializable;

/**
 * Created by grant on 2018/6/27.
 */
public class Student implements Serializable {
    private static final long serialVersionUID=6013572251564847389L;    
    private String name;
    private char sex;
    private int age;
    private double weight;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String name, char sex, int age, double weight) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.weight = weight;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public char getSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
}

2、创建序列化的类,需要创建一个File文件,可以看出序列化后的文件内容,为了演示效果,使用了txt文件,然后转化成字节流的形式来序列化这几个对象。

import java.io.*;

/**
 * Created by grant on 2018/6/27.
 */
public class Serializable {
    public static void main(String args[]){
        Student student=new Student("张三",'男',20,70.0);
        File file =new File("E:/datasource/Serializable/student.txt");
        try {
            file.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            /**
             * 使用字节流序列化student对象
             */
            FileOutputStream fos=new FileOutputStream(file);
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            oos.writeObject(student);
            oos.flush();
            oos.close();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        /**
         * 使用字节流反序列化查看对象
         */
        try {
            FileInputStream fis=new FileInputStream(file);
            ObjectInputStream ois=new ObjectInputStream(fis);
            Student student1 = (Student) ois.readObject();
            System.out.println(student1.toString());
            fis.close();
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

3、打开文件student.txt查看,这个就是上面解释的二进制串,是容易传输的一种格式,如果想看结果,就要进行反序列化。

 sr com.cnpc.java.StudentSt€1 I ageC sexD weightL namet Ljava/lang/String;xp   u7@Q€     t 寮犱笁

4、反序列化,结果

C:\App\Java\jdk1.8.0_92\bin\java "-javaagent:E:\BigData\software\IntelliJ IDEA 2017.1.5\lib\idea_rt.jar=58748:E:\BigData\software\IntelliJ IDEA 2017.1.5\bin" -classpath C:\Users\guoyg\AppData\Local\Temp\classpath.jar -Dfile.encoding=UTF-8 com.cnpc.java.Serializable
Student{name='张三', sex=男, age=20, weight=70.0}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值