Java之序列化与反序列化

       Java序列化与反序列化是什么?干什么用的等等这些问题真的困扰了我很久了,总是不理解为什么要序列化,又为什么要反序列化?在什么情况下会用到Java的序列化和反序列化呢?直到今天学习了MapReduce,才深刻的理解了Java序列化和反序列话的作用及什么情况下使用。

Java序列化与反序列化是干什么的?
       如果一个对象被序列化之后保存在文件中,可以通过反序列化将对象的类型信息,对象的数据及对象中的数据类型在内存中从新新建。通俗点理解就是,一个对象在一台机器上被序列化保存在文件中,可以在另外一台机器上通过反序列化从新新建这个对象。

使用序列化和反序列化的好处?
  1. 实现了数据的持久化,通过序列化将数据永久的保存在文件中或数据库中。
  2. 利用序列化实现远程通信,即在网络上传送对象的字节序列。简单点说,就是发送方把需要发送的对象转换为字节序列,然后在网络上传输。接收方需要从字节序列中恢复出Java对象。
如何实现Java序列化与反序列化呢?
  • java.io.ObjectOutputStream:表示对象输出流
          它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
  • java.io.ObjectInputStream:表示对象输入流
          它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

实现序列化的要求?
       只有实现了Serializable了接口的类的对象才能被序列化,否则抛出NotSerializableException异常。
案例:
  • User类:
public class User implements Serializable {
    private String username;
    private int age;

    public User() {
    }
    public User(String username, int age) {
        this.username = username;
        this.age = age;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}

  • 将序列化的对象保存在文件中
    @Test
    public void out(){
        User user = new User("张三",18);
        File file = new File("d://out.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(user);
            objectOutputStream.flush();
            objectOutputStream.close();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


结果:
                       
  • 通过反序列化从新生成对象
    @Test
    public void input(){
        File file = new File("d://out.txt");

        try {
            FileInputStream inputStream = new FileInputStream(file);
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            User user = (User) objectInputStream.readObject();
            System.out.println(user);

            objectInputStream.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


结果:
                 

总结:
  • Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。
  • 采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。
  • 继续巩固基础。↖(^ω^)↗!!!

发布了62 篇原创文章 · 获赞 43 · 访问量 22万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章