首页 > 编程语言 >Java 序列化

Java 序列化

时间:2022-09-08 10:00:51浏览次数:88  
标签:Java 对象 tj address println 序列化

Java 序列化

当一个对象需要持久化(存储)或者传输的时候,就用到了序列化。对象可以转换成字节序列,该字节序列包括这个对象的数据和类型信息也包括存储在对象中数据的类型。

将序列化对象持久化(写入文件)之后,可以从持久化的媒介(文件)中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型以及方法,都可以用来在内存中新建对象。

整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

 

一个类的对象要想序列化成功,必须满足两个条件:

1、该类必须实现 java.io.Serializable 接口。(Serializable是一个标记接口,没有需要实现的方法。标记接口别名《Marker Interface》和《Tag interface》)

2、该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的(transient)。

如果你想知道一个 Java 标准类是否是可序列化的,请查看该类的文档。检验一个类的实例是否能序列化十分简单, 只需要查看该类有没有实现 java.io.Serializable接口。

 

序列化和反序列化 Demo

用 FileOutputStream 和 ObjectOutputStream 类来序列化对象,并将该对象序列化到一个文件中。

再用 FileInputStream 和 ObjectInputStream 类来从文件中读取,并反序列化这个对象。

注意: 按照 Java 的标准约定是给文件一个 .ser 扩展名,但是实际只要符合文件命名规则就可以序列化。

/**
 * 对象的序列化和反序列化
 */
public class ObjectSerializeDemo implements Serializable {

    private int old = 8;
    String name = "tianjun";
    transient String address = "北京";
    Number phone;

    void print() {
        System.out.println(String.format("name=%s; old=%d; phone=%d; address=%s", name, old, phone, address));
    }

    public static void main(String[] args) {
        ObjectSerializeDemo tj = new ObjectSerializeDemo();
        tj.phone = 123456789;
        tj.old = 18;
        tj.address = "石家庄";

        System.out.println("需要序列化的对象");
        tj.print();

        System.out.println("序列化");
        try {
            FileOutputStream fileOutputStream = new FileOutputStream("e:\\tj.s");
            try {
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
                objectOutputStream.writeObject(tj);
                objectOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("====================================");
        System.out.println("反序列化");
        try {
            FileInputStream fileInputStream = new FileInputStream("e:\\tj.s");
            try {
                ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
                try {
                    ObjectSerializeDemo o = (ObjectSerializeDemo) objectInputStream.readObject();

                    System.out.println("反序列化后的对象");
                    o.print();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}

输出内容如下:

  需要序列化的对象
  name=tianjun; old=18; phone=123456789; address=石家庄
  序列化
  ====================================
  反序列化
  反序列化后的对象
  name=tianjun; old=18; phone=123456789; address=null

注意:address 注明了transient,所以反序列化后=null

标签:Java,对象,tj,address,println,序列化
From: https://www.cnblogs.com/h2285409/p/16668441.html

相关文章

  • Java
    Java概念简述基本环境JVM:Java虚拟机(Java程序是运行在JVM上的,不同平台的JVM实现了Java程序的跨平台运行)JRE:Java运行环境(JRE=JDK+核心类库和相关文件)JDK:J......
  • Java报错Failed to read candidate component class: file
    java.io.IOException:ServerreturnedHTTPresponsecode:500forURL:http://localhost:8080/xxxxxx/getJcpeizhisatsun.net.www.protocol.http.HttpURLConnection.......
  • JAVA 环境搭建(java 8为例)
    JAVA环境搭建下载JDK(java8为例)JDK下载地址:直达JDK镜像网站:编程宝库 javajdk镜像  安装JDK(java8为例)双击启动下载的exe文件单击下一步   可以......
  • JavaSe-day02-基本概念
    Java基本语法本章内容有注释,关键字,字面量,变量!注释什么是注释注释是在程序指定位置添加的说明性信息,就是对代码的一种解释。注释的分类1.单行注释格式://注释信息......
  • 微软出品自动化神器Playwright,不用写一行代码(Playwright+Java)系列(一) 之 环境搭建及
    一、前言半年前,偶然在视频号刷到某机构正在直播讲解Playwright框架的使用,就看了一会,感觉还不错,便被种草,就想着自己有时间也可以自己学一下,这一想着就半年多过去了。读到......
  • JavaGUI(一)——布局
    AWT编程AWT简介当JDK1.0发布时,Sun公司提供了一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行,这套基本类库被称为“抽象窗口工具集(AbstractWindowToolkit)”,......
  • Java学习心得1
    学习了一学期的Java课程,觉得是该总结自己的心得体会了。开始学习任何一门课(包括java),兴趣最重要。一直觉得自己在学计算机编程语言,学习了很多,但每门语言都停留在知识边缘......
  • Java学习心得2
    在学习Java的过程中我得出这样的结论:1.学习中,要养成良好的习惯(写括号时要成对,字母大小写要区分,单词拼写要准确)。2.在学习的过程中,最好不是仅仅停留在java表层,不是抄书上的......
  • Java学习心得3
    学习Java必须做到三步走:1.课前预习;2.课上认真听讲,做笔记;3.课下多练,多敲代码,多总结.因为Java是一种面向对象的编程语言,刚接触的时候可能会感觉比较抽象,上课的时候......
  • java.lang.OutOfMemoryError: GC overhead limit exceeded
    1背景公司的一个项目,平时运行一直没问题,但是最近,时不时的会报出 java.lang.OutOfMemoryError:GCoverheadlimitexceeded 错误,然后,java进程就处于假死状态,几天都不会......