我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java序列化与反序列化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java序列化与反序列化

Java 序列化与反序列化

Java序列化把一个对象Java Object变为一个二进制字节序列byte[]

Java反序列化就是把一个二进制字节序列byte[] 变为Java对象Java Object

序列化API

ObjectOutputStream

字节输出流对象,将对象的输出流写到文件中(结合FileOutputStream使用)

实例:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
或
FileOutputStream fout = new FileOutputStream("1.txt");
ObjectOutputStream out = new ObjectOutputStream(fout);

此外ObjectOutputStream还提供了writeObject()方法来序列化一个对象,并将它发送到输出流。

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
out.writeObject(new Test("Sentiment",10));        //对Test类中的构造方法进行传参

ObjectInputStream

字节输入流对象,将文件中的二进制字节序列进行反序列化操作(结合FileInputStream)

实例:

ObjectInputStream in = new ObjectInputStream(new FileInputStream("1.txt"));
或
FileInputStream fin = new FileInputStream("1.txt");
ObjectInputStream oin = new ObjectInputStream(fin);

此外ObjectInputStream还提供readObject()方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,需要将它转换成合适的数据类型。

ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));
Test o = (Test)In.readObject();
System.out.println(o);        //读取后输出实例理解

实例理解

Test.java(类想要进行序列化操作,必须实现Serializable接口继承)

package Sentiment.unserialize.demo01;

import java.io.Serializable;

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

    public Test() {
    }

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

    @Override
    public String toString() {
        return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
    }

}

Serializable.java

package Sentiment.unserialize.demo01;

import java.io.*;

public class Serializable {
    public static void main(String[] args) throws IOException {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
        out.writeObject(new Test("Sentiment",10));
        out.close();
    }
}

 UnSerializable.java

package Sentiment.unserialize.demo01;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class UnSerializable {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));
        Test o = (Test)In.readObject();
        System.out.println(o);
    }
}

运行Serializable.java后便得到二进制字节码文件内容

此时在运行UnSerializable.java便得到了二进制字节码反序列化后的内容

serialVersionUID

  • 每个可序列化的类在序列化时都会关联一个版本号 , 这个版本号就是 serialVersionUID 属性
  • serialVersionUID 属性必须通过 static final long 修饰符来修饰 。
  • 如果可序列化的类未声明 serialVersionUID 属性 , 则 Java 序列化时会根据类的各种信息来计算默认的 serialVersionUID 值 . 但是 Oracle 官方文档强烈建议所有可序列化的类都显示声明 serialVersionUID 值 .

实例理解

在Test.java中定义serialVersionUID 其值为1

package Sentiment.unserialize.demo01;

import java.io.Serializable;

public class Test implements Serializable {
    public static final long serialVersionUID = 1L;   //定义serialVersionUID 

    private  String name;
    private  int age;

    public Test() {
    }

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

    @Override
    public String toString() {
        return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
    }

}

此时运行Serializable.java进行序列化操作

运行完毕后将serialVersionUID的值定义为2—>public static final long serialVersionUID = 2L;,在运行UnSerializable.java会报错

Transient (瞬态变量)

Transient( 瞬态变量 )是一个 Java 关键词 , 它用于标记类的成员变量在持久化到字节流时不要被序列化 ; 在通过网络套接字流传输字节流时 , transient 关键词标记的成员变量不会被序列化 。此为被static修饰的静态变量也不参与序列化操作。

实例理解

将Test.java中的nameage变量前分别加上transientstatic

package Sentiment.unserialize.demo01;

import java.io.Serializable;

public class Test implements Serializable {
    public static final long serialVersionUID = 1L;  //定义serialVersionUID 
    private transient String name;                     //加上transient
    private static int age;                             //加上static

    public Test() {
    }

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

    @Override
    public String toString() {
        return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
    }

}

此时在执行Serializable.java和UnSerializable.java,输出结果:Sentiment—>null,10—>0

readObject()方法重写

​ 官方允许用户在被序列化的类中重写 readObject() 方法 , 重写后的方法将负责在反序列化时重构当前类对象 . 用户只需要在重写的 readObject() 方法中实现 defaultReadObject() 方法 , 就可以确保反序列化过程正常执行 .

实例理解

实现 defaultReadObject() 方法调用,并在Test类中重写该方法,在进行序列化和反序列化操作即可执行命令

private void readObject(java.io.ObjectInputStream a) throws IOException, ClassNotFoundException{
    a.defaultReadObject();
    Runtime.getRuntime().exec("calc.exe");
}

总结

  • 类想要进行序列化操作,必须实现Serializable接口继承
  • 强烈建议定义serialVersionUID ,序列化、反序列化前后不要修改其值
  • 被static、Transient修饰的属性,不会进行序列化操作
  • readObject()方法重写时,需要实现defaultReadObject() 方法

 以上就是Java序列化与反序列化的详细内容,更多关于Java序列化与反序列化的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java序列化与反序列化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java序列化与反序列化

这篇文章主要介绍了Java的序列化与反序列化,序列化把一个对象JavaObject变为一个二进制字节序列byte[];反序列化就是把一个二进制字节序列byte[]变为Java对象JavaObject。感兴趣的小伙伴可以参考阅读
2023-05-14

如何调试 Java 序列化与反序列化?(Java序列化与反序列化怎样调试)

在Java开发中,序列化与反序列化是非常重要的概念,它们允许对象在不同的进程或存储介质之间进行传输和存储。然而,在实际应用中,我们可能会遇到序列化与反序列化相关的问题,需要进行调试。本文将介绍如何调试Java序列化与反序列化,帮助你解决遇到的问题。一、了
如何调试 Java 序列化与反序列化?(Java序列化与反序列化怎样调试)
Java2024-12-20

序列化与反序列化

序列化(pickling)  把变量从内存中变成可存储或传输的过程反序列化(unpickling)  把变量内容从序列化的对象重新读到内存里的过程序列化&反序列化的意义  在程序运行过程中,对象可在内存中被自由的修改  一旦程序结束,对象所
2023-01-31

Java 序列化与反序列化容易出错吗?(Java序列化与反序列化会出错吗)

在Java编程中,序列化与反序列化是两个重要的概念,它们在对象的持久化和网络传输等方面发挥着关键作用。然而,许多开发者在使用这两个功能时,常常会遇到各种出错的情况。本文将深入探讨Java序列化与反序列化可能出错的原因、表现形式以及如何避免这些错误。一、序
Java 序列化与反序列化容易出错吗?(Java序列化与反序列化会出错吗)
Java2024-12-20

Java 序列化与反序列化使用起来方便吗?(Java序列化与反序列化易用吗)

在Java编程中,序列化与反序列化是两个重要的概念。序列化允许将对象转换为字节流,以便在网络传输或存储到磁盘上;反序列化则是将字节流恢复为对象的过程。那么,Java序列化与反序列化易用吗?这是许多Java开发者常常关注的问题。一、序列化的基本概念和用途
Java 序列化与反序列化使用起来方便吗?(Java序列化与反序列化易用吗)
Java2024-12-13

Java 序列化与反序列化如何避免风险?(Java序列化与反序列化怎样避免风险)

在Java开发中,序列化与反序列化是非常重要的技术,它们允许对象在不同的环境之间进行传输和存储。然而,如果不妥善处理,这些操作可能会带来严重的安全风险,如远程代码执行、数据泄露等。本文将介绍Java序列化与反序列化的基本概念,以及如何避免在使用这些技术时可能出现的风险。
Java 序列化与反序列化如何避免风险?(Java序列化与反序列化怎样避免风险)
Java2024-12-14

Java序列化与反序列化怎么实现

本篇内容主要讲解“Java序列化与反序列化怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java序列化与反序列化怎么实现”吧!序列化与反序列化概念序列化 (Serialization)是
2023-06-02

Java序列化与反序列化怎么应用

这篇“Java序列化与反序列化怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java序列化与反序列化怎么应用”文章吧
2023-07-05

Java 序列化与反序列化安全吗?深度剖析与实战指南(Java序列化与反序列化安全吗)

在Java编程领域,序列化与反序列化是非常重要的概念,它们允许对象在不同的进程或系统之间进行传输和存储。然而,随之而来的安全问题也备受关注,那么Java序列化与反序列化到底安全吗?本文将深入探讨这个问题,并提供一些实战指南来帮助开发者更好地保护系统安全。
Java 序列化与反序列化安全吗?深度剖析与实战指南(Java序列化与反序列化安全吗)
Java2024-12-15

Java对象的序列化与反序列化详解

一、序列化和反序列化的概念把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化。对象的序列化主要有两种途径:Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中Ⅱ. 在网络上传送对象的字节序
2023-05-31

Java的序列化与反序列化怎么实现

本篇内容介绍了“Java的序列化与反序列化怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java对象的序列化Java平台允许我们在内
2023-07-04

Java 中序列化与反序列化的作用究竟是什么?(java中序列化与反序列化的作用是什么)

在Java编程中,序列化(Serialization)与反序列化(Deserialization)是两个非常重要的概念,它们在对象的持久化、网络传输等方面发挥着关键作用。一、序列化的作用序列化是将对象转换为字节流的过程,通过
Java 中序列化与反序列化的作用究竟是什么?(java中序列化与反序列化的作用是什么)
Java2024-12-18

深入浅析Java中的序列化与反序列化

这篇文章将为大家详细讲解有关深入浅析Java中的序列化与反序列化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java 序列化和反序列化实例详解在分布式应用中,对象只有经过序列化才能在各个分
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录