Java序列化API的使用

简介: Java序列化API的使用

Java对象序列化

为什么需要序列化呢?详情可以看一下这篇博客

https://blog.csdn.net/liu16659/article/details/85793686

Java序列化API为处理对象序列化提供了一个标准机制,具体的Java序列化需要注意以下事项

  • 类要实现序列化功能,只需要 实现java.io.Serializable接口即可
  • 序列化和反序列化必须保持序列化的ID一致,一般使用
private static final long serializableId 
  • 定义序列化的ID
  • 序列化并不保存静态变量
  • 在序列化父类变量时,父类也需要实现Serializable接口
  • 使用transient关键字可以防止该变量被序列化,再被反序列化之后,transient变量的值被设定为对应类型的初始值,例如,int类型的变量的值是0,对象类型的变量会是null。
package com.oracle.serializable;
import java.io.*;
/**
 * @author zhouyanxiang
 * @create 2020-08-2020/8/17-18:29
 * 序列化之后乱码是正常的,因为序列化和反序列话是基于二进制流的,序列话便是把java对象的信息以二进制存储在文件obj.bat中,用文本编辑器打开自然是乱码。
 * 只有通过反序列话才能将存储的二进制读取出来,然后显示在控制台上。
 */
public class SerializableReview {
    static class Worker implements Serializable {
        // 自定义序列化的ID
        private static final long serializableId = 123456789L;
        // 将要被序列化的属性name
        private String  name;
        // transient修饰的变量不会被序列化
        private transient int salary;
        // 静态变量属于类信息,不属于对象的状态,因此不会被序列化
        static int age = 23;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 序列化到磁盘
        FileOutputStream fos =  new FileOutputStream("work.out");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Worker  worker = new Worker();
        worker.setName("alex");
        oos.writeObject(worker);
        oos.flush();
        oos.close();
        // 反序列化磁盘数据并解析磁盘数据
        FileInputStream fis =  new FileInputStream("work.out");
        ObjectInputStream  ois = new ObjectInputStream(fis);
        Worker workerTest = (Worker) ois.readObject();
        System.out.println(workerTest.getName());
    }
}

直接打开文件将会是乱码的

只有通过反序列化才能读出对象的信息

Java序列化API为处理对象序列化提供了一个标准机制,具体的Java序列化需要注意以下事项

  • 类要实现序列化功能,只需要 实现java.io.Serializable接口即可
  • 序列化和反序列化必须保持序列化的ID一致,一般使用
private static final long serializableId 
  • 定义序列化的ID
  • 序列化并不保存静态变量
  • 在序列化父类变量时,父类也需要实现Serializable接口
  • 使用transient关键字可以防止该变量被序列化,再被反序列化之后,transient变量的值被设定为对应类型的初始值,例如,int类型的变量的值是0,对象类型的变量会是null。
package com.oracle.serializable;
import java.io.*;
/**
 * @author zhouyanxiang
 * @create 2020-08-2020/8/17-18:29
 * 序列化之后乱码是正常的,因为序列化和反序列话是基于二进制流的,序列话便是把java对象的信息以二进制存储在文件obj.bat中,用文本编辑器打开自然是乱码。
 * 只有通过反序列话才能将存储的二进制读取出来,然后显示在控制台上。
 */
public class SerializableReview {
    static class Worker implements Serializable {
        // 自定义序列化的ID
        private static final long serializableId = 123456789L;
        // 将要被序列化的属性name
        private String  name;
        // transient修饰的变量不会被序列化
        private transient int salary;
        // 静态变量属于类信息,不属于对象的状态,因此不会被序列化
        static int age = 23;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 序列化到磁盘
        FileOutputStream fos =  new FileOutputStream("work.out");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Worker  worker = new Worker();
        worker.setName("alex");
        oos.writeObject(worker);
        oos.flush();
        oos.close();
        // 反序列化磁盘数据并解析磁盘数据
        FileInputStream fis =  new FileInputStream("work.out");
        ObjectInputStream  ois = new ObjectInputStream(fis);
        Worker workerTest = (Worker) ois.readObject();
        System.out.println(workerTest.getName());
    }
}

直接打开文件将会是乱码的

只有通过反序列化才能读出对象的信息


相关文章
|
7月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
7月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
363 100
|
7月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
369 101
|
7月前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
398 101
|
7月前
|
安全 Java API
使用 Java 构建强大的 REST API 的四个基本技巧
本文结合探险领域案例,分享Java构建REST API的四大核心策略:统一资源命名、版本控制与自动化文档、安全防护及标准化异常处理,助力开发者打造易用、可维护、安全可靠的稳健API服务。
466 116
|
8月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
8月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
437 188
|
8月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
344 92
|
9月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
456 80
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
323 1
下一篇
开通oss服务