Java-序列化 —(一)

1、什么是序列化与反序列化

序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进制串的过程。

反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

2、为什么要序列化

①、在分布式系统中,此时需要把对象在网络上传输,就得把对象数据转换为二进制形式,需要共享的数据的 JavaBean 对象,都得做序列化。

②、服务器钝化:如果服务器发现某些对象好久没活动了,那么服务器就会把这些内存中的对象持久化在本地磁盘文件中(Java对象转换为二进制文件);如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成 Java 对象。这样能节省服务器内存。

3、Java 怎么进行序列化?

①、需要做序列化的对象的类,必须实现序列化接口:Java.lang.Serializable 接口(这是一个标志接口,没有任何抽象方法),Java 中大多数类都实现了该接口,比如:String,Integer

②、底层会判断,如果当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断。

③、在 Java 中使用对象流来完成序列化和反序列化

  ObjectOutputStream:通过 writeObject()方法做序列化操作

  ObjectInputStream:通过 readObject() 方法做反序列化操作
image.png
package com.SerializeDemo;

import java.io.Serializable;

public class Person implements Serializable {

    public enum Sex{
        Female,
        Male
    }

    private static final long serialVersionUID = 8656128222714547171L;
    transient private String name;
    private int age;
    private Sex sex;

    Person(String name,int age){
    this.name= name;
    this.age=age;
    this.sex = Sex.Female;
    }

    public int getAge() {
    return age;
    }

    public String getName() {
    return name;
    }

    public void setAge(int age) {
    this.age = age;
    }

    public Sex getSex() {
        return sex;
    }

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

    public void setSex(Sex sex) {
        this.sex = sex;
    }
}

package com.SerializeDemo;

import java.io.*;

public class SerializeDemo {

    public static void main(String[] args) throws ClassNotFoundException {

        try {
            OutputStream outputStream = new FileOutputStream(System.getProperty("user.dir")+"/src/main/java/com/SerializeDemo/"+ File.separator+"person.txt");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
            objectOutputStream.writeObject(new Person("Monica",19));
            objectOutputStream.close();

            InputStream inputStream = new FileInputStream(System.getProperty("user.dir")+"/src/main/java/com/SerializeDemo/"+ File.separator+"person.txt");
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            Person person = (Person) objectInputStream.readObject();
            System.out.println(person.getSex());
            objectInputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }



}

1、不需要序列化的字段用transient修饰;
2、JavaBean 对象中增加一个 serialVersionUID 字段,用来固定版本,避免反序列化失败;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件。那你最好再阅读该篇文章,文章对序列化...
    jiangmo阅读 3,462评论 0 2
  • Java序列化 1. 什么是序列化? 序列化是将一个对象的状态,各属性的值序列化保存起来,然后在合适的时候通过反序...
    王小冬阅读 1,346评论 0 0
  • 概念 序列化:就是把对象转化成字节。反序列化:把字节数据转换成对象。 对象序列化场景: 1、对象网络传输例如:在微...
    jijs阅读 12,958评论 1 25
  • 题外话:从事IT要学习的东西太多了,有时候会比较浮躁,因为要学的东西太多但又无从下手,甚至有很多基础都还没有深入学...
    Garwer阅读 4,223评论 2 9
  • 感赏今天过得非常非常开心! 感赏今天去健身房跑了2500米,洗澡、按摩脚。 感赏今天又中了100...
    猫公主喵阅读 2,615评论 0 1

友情链接更多精彩内容