IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> JAVA对象序列化 -> 正文阅读

[网络协议]JAVA对象序列化

JAVA对象序列化流

对象序列化:将对象保存到磁盘中,或者在网络中传输对象。其使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息。
字节序列写到文件之后,相当于在文件中持久保存了一个对象的信息。该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。

要实现序列化和反序列化就要使用对象系列化流和对象反序列化流:

  • 对象序列化流: ObjectInputStream
  • 对象反序列化流: ObjectOutputStream
使用案例:
  1. 序列化对象,首先需要创建对象,并且该对象需要实现Serializable接口
import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
	@Override
	    public String toString() {
	        return "Person{" +
	                "name='" + name + '\'' +
	                ", age=" + age +
	                '}';
	    }
}
  1. 对象序列化和反序列化操作。
import java.io.*;
import java.text.ParseException;

public class test2 {
    public static void main(String[] args) throws ParseException, IOException, ClassNotFoundException {
        // 1. 对象序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("person.txt"));
        Person p = new Person("张三",40);
        //序列化对象
        objectOutputStream.writeObject(p);
        // 释放资源
        objectOutputStream.close();

        // 2.对象反序列化流
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("person.txt"));
        // 反序列化对象,默认返回的对象为Object,即所有对象的父类
        Object o = objectInputStream.readObject();
        // 向下转型
        Person pp = (Person) o;
        System.out.println(pp);

        objectInputStream.close();
    }
}

注意事项

1.用对象序列化流序列化一个对象到文件之后,如果修改了对象所属的类文件,进行对象反序列化会发生问题,以及解决方法。

当我们将Person对象序列化到文件之后,修改了Person类,比如增加了一个成员变量,或者增加了一个方法,此时如果要对持久化的对象进行反序列化,则会抛出java.io.InvalidClassException

问题的原因在于:类的串行版本与从流中读取的类描述符的类型不匹配。也就是在对Person类未修改前其有一个序列化版本号,在对类进行修改之后,其序列化版本号发生了改变,则会导致对象反序列化失败,具体见下图:
在这里插入图片描述
用对象序列化流序列化一个对象到文件之后,如果修改了对象所属的类文件,也要对对象进行反序列化,为保证不发生问题,则需要在对象的类文件内部添加如下代码:(serialVersionUID为自己指定的值)

    private static final long serialVersionUID = 11333L;

2.如果一个对象中的某个成员变量不想被序列化。

给对象中不想被序列化的成员变量加关键字 transient即可。
比如不想序列化Person中的age,则:

private transient int age;
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:12:37  更:2022-04-26 12:14:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:23:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码