Java中对象序列化和反序列化方法

Java通过实现Serializable接口实现对象序列化与反序列化,使用ObjectOutputStream和ObjectInputStream进行读写操作,推荐显式声明serialVersionUID以确保版本兼容性;transient关键字可标记不参与序列化的字段,用于保护敏感数据;通过自定义writeObject和readObject方法能控制序列化过程,实现加密等逻辑;但反序列化存在安全风险,如任意代码执行漏洞,需通过过滤类、避免序列化敏感信息等方式防范。

java中对象序列化和反序列化方法

Java中对象序列化和反序列化,简单来说,就是把Java对象转换成字节流,以及把字节流恢复成Java对象的过程。这对于持久化对象状态,或者在网络上传输对象非常有用。

序列化:将Java对象转换为字节流。反序列化:将字节流转换回Java对象。

序列化和反序列化在Java中是如何实现的?

要让一个Java对象能够被序列化,需要实现

java.io.Serializable

接口。这个接口是一个标记接口,没有任何方法需要实现,它的作用就是告诉JVM,这个类的对象是可以被序列化的。

import java.io.*;public class MyObject implements Serializable {    private static final long serialVersionUID = 1L; // 推荐显式声明    private String name;    private int age;    public MyObject(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    public static void main(String[] args) {        MyObject obj = new MyObject("Alice", 30);        // 序列化        try (FileOutputStream fileOut = new FileOutputStream("myobject.ser");             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {            out.writeObject(obj);            System.out.println("Serialized data is saved in myobject.ser");        } catch (IOException i) {            i.printStackTrace();        }        // 反序列化        try (FileInputStream fileIn = new FileInputStream("myobject.ser");             ObjectInputStream in = new ObjectInputStream(fileIn)) {            MyObject obj2 = (MyObject) in.readObject();            System.out.println("Deserialized Object: Name = " + obj2.getName() + ", Age = " + obj2.getAge());        } catch (IOException i) {            i.printStackTrace();        } catch (ClassNotFoundException c) {            System.out.println("MyObject class not found");            c.printStackTrace();        }    }}

这段代码展示了如何将一个

MyObject

对象序列化到文件

myobject.ser

,然后再从该文件中反序列化出来。 需要注意的是,

serialVersionUID

的作用。 它是用来在反序列化时验证类的版本一致性的。 如果类的结构发生了改变(比如增加了字段),而

serialVersionUID

没有改变,反序列化可能会失败。 所以,推荐显式地声明

serialVersionUID

立即学习“Java免费学习笔记(深入)”;

transient 关键字有什么用?

有时候,我们不希望某个字段被序列化。 例如,一个密码字段,或者一个缓存对象。 可以使用

transient

关键字来标记这些字段。

import java.io.*;public class MyObject implements Serializable {    private static final long serialVersionUID = 1L;    private String name;    private transient String password; // 不会被序列化    public MyObject(String name, String password) {        this.name = name;        this.password = password;    }    // ...}

当对象被序列化时,

password

字段的值会被忽略。 在反序列化后,

password

字段的值会是

null

(对于对象引用) 或默认值 (对于基本类型)。 这是一个保护敏感数据的好方法。

启科网络PHP商城系统 启科网络PHP商城系统

启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

启科网络PHP商城系统 0 查看详情 启科网络PHP商城系统

自定义序列化和反序列化

Java 提供了自定义序列化和反序列化的机制,通过实现

writeObject

readObject

方法。 这允许你控制序列化和反序列化的过程,例如,加密敏感数据,或者处理复杂的对象关系。

import java.io.*;public class MyObject implements Serializable {    private static final long serialVersionUID = 1L;    private String name;    private transient String password;    public MyObject(String name, String password) {        this.name = name;        this.password = password;    }    private void writeObject(ObjectOutputStream out) throws IOException {        // 自定义序列化逻辑        out.defaultWriteObject(); // 先序列化非 transient 字段        // 加密 password        String encryptedPassword = encrypt(password);        out.writeObject(encryptedPassword);    }    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {        // 自定义反序列化逻辑        in.defaultReadObject(); // 先反序列化非 transient 字段        // 解密 password        String encryptedPassword = (String) in.readObject();        this.password = decrypt(encryptedPassword);    }    private String encrypt(String password) {        // 简单的加密示例,实际应用中需要更强的加密算法        return new StringBuilder(password).reverse().toString();    }    private String decrypt(String encryptedPassword) {        // 简单的解密示例        return new StringBuilder(encryptedPassword).reverse().toString();    }    // ...}

在这个例子中,

writeObject

方法在序列化时加密了

password

字段,

readObject

方法在反序列化时解密了

password

字段。 注意

defaultWriteObject

defaultReadObject

方法,它们用于序列化和反序列化非

transient

字段。

序列化和反序列化有什么安全风险?

反序列化漏洞是Java中一个常见的安全问题。 如果攻击者能够控制序列化的数据,他们可以构造恶意对象,导致任意代码执行。 例如,攻击者可以构造一个包含恶意命令的对象,当这个对象被反序列化时,恶意命令就会被执行。

为了避免反序列化漏洞,可以采取以下措施:

避免序列化敏感数据。使用安全的序列化框架,例如 Kryo。使用对象过滤,限制可以被反序列化的类。禁用不必要的反序列化功能。

总而言之,Java的序列化和反序列化机制非常强大,但也需要谨慎使用,特别是涉及到安全问题时。

以上就是Java中对象序列化和反序列化方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/744815.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月25日 17:08:21
下一篇 2025年11月25日 17:08:44

相关推荐

  • 新手须知的全网最全币圈名词-小白必读

    对于初入币圈的新手来说,理解行业内的各种专业术语是开启探索之旅的第一步。这些名词是沟通和学习的基础,掌握它们可以帮助你更快地了解市场动态和项目信息。 2025年虚拟货币主流交易所: 币安:  欧易:  火币:  什么是交易所? 交易所是专门用于买卖、交易加密货币的在线平台,类似于我们熟悉的股票交易所…

    好文分享 2025年12月9日
    000
  • LINK价格突破 24 美元关键阻力分析:Chainlink 项目基本面与价格走势

    目录 当前价格走势与关键技术信号推动 LINK 上涨的核心因素鲸鱼与机构资金强势入场战略储备机制强化通缩预期传统金融巨头采用加速生态扩张项目基本面:主导现实世界资产(RWA) token化浪潮价格预测:短期动能与长期潜力总结 当前价格走势与关键技术信号 ‍阻力与支撑位:若今日有效突破 24.64 美…

    2025年12月9日
    000
  • token和数字货币的区别

    数字货币是拥有独立区块链的原生资产,如比特币和以太坊,主要用于价值储存和交易;Token则是基于现有区块链(如以太坊)发行的代币,依赖底层网络,通过智能合约实现多样化功能,如实用、治理或稳定币。两者核心区别在于原生性与依附性,应用场景和发行方式也不同。 在数字货币的浩瀚宇宙中,我们经常会听到“Tok…

    好文分享 2025年12月9日
    000
  • 币圈山寨币都会归零吗

    并非所有山寨币都会归零,但中小市值币种风险高达50%-90%,%ignore_a_2%如BTC、ETH归零概率低于5%;历史显示40%-60%山寨币因技术缺陷、团队跑路等原因消亡,2025年或降至30%-50%;当前为“选择性牛市”,仅少数具实际价值项目能存活。 币圈山寨币都会归零吗? 答案是否定的…

    好文分享 2025年12月9日
    000
  • Token 和 Coin 有什么区别

    Coin拥有独立区块链,是原生资产,如比特币和以太坊;Token则基于现有区块链发行,如以太坊上的ERC-20代币,用于代表权益或服务。 Coin 的定义与特征 Coin,即通常所说的加密货币,是拥有自己独立区块链网络的数字资产。它们是区块链的原生资产,用于维护其所在网络的运行,并充当该网络的价值存…

    好文分享 2025年12月9日
    000
  • 以太坊突破 4,700 美元创三年新高,2025 年价格预测最高看至 15,000 美元

    目录 当前市场动态与技术面解析机构与分析师 2025 年价格预测汇总推动以太坊上涨的三大核心因素短期走势与风险提示结语:基础设施价值重估的新起点 据 实时行情统计,截至 2025 年 8 月 14 日,eth 报价为 $4,732.44,过去 24 小时上涨 2.86%。期间价格一度冲高至 $4,7…

    2025年12月9日
    000
  • 什么是Pixelverse(PIXFI币)?PIXFI代币经济学及价格预测

    目录 什么是Pixelverse (PIXFI)?Pixelverse (PIXFI)的特点Pixelverse (PIXFI)概述Pixelverse 游戏如何运作? Pixelverse (PIXFI)的应用/效用1. 支付、治理和激励2. 制作和定制3. 经济活动4. 激励和奖励5. 合作伙伴…

    2025年12月9日
    000
  • okens在人工智能中的含义

    Token是AI语言处理的核心单元,将文本拆分为单词、子词或字符等基本块,用于模型输入输出。它实现输入标准化、提升计算效率,并支持多语言处理。在语言模型训练中,如GPT-3使用约5000亿tokens学习语言规律;在文本生成中,AI逐token输出内容,确保流畅性。不同模型对token定义不同,例如…

    2025年12月9日
    000
  • tokens什么意义怎么读?1个tokens多少汉字?

    Token读作/ˈtoʊkən/(“透肯”),是AI处理文本的基本单位,1个token平均对应约1.2个汉字,具体取决于分词策略;其核心作用是将语言数字化、提升处理效率并实现跨语言统一处理。 Tokens的意义、读音与汉字对应关系 在人工智能领域,token(读作/ˈtoʊkən/,音似&#8221…

    2025年12月9日
    000
  • 一百万TOKENs大概多少字?

    一百万Tokens约等于75万英文单词或55万-100万汉字,具体因语言、模型分词规则和文本复杂度而异,可处理2,500页文档或7.5万行代码,适用于代码分析、学术研究和法律文书等场景。 一百万Tokens相当于多少文字? 一百万Tokens大约对应750,000个英文单词或50万-100万个汉字,…

    2025年12月9日
    000
  • 币圈token是什么意思?

    Token是基于区块链发行的数字资产,依托智能合约在现有公链上创建,具备可编程性,用于代表多种价值和功能,如访问服务、治理投票、资产所有权等,不同于拥有独立主网的Coin,Token通过ERC-20、ERC-721等标准实现兼容与互操作,广泛应用于DeFi、NFT和DApp生态中。 币圈Token是…

    2025年12月9日
    000
  • token是什么区块链

    Token是基于区块链的数字资产,具备去中心化、可编程、可交易、安全和互操作特性;不同于拥有独立链的加密货币,Token依附于现有区块链(如以太坊),通过智能合约发行,需底层链的加密货币支付Gas费;按功能可分为支付、功能、证券、NFT和治理Token,广泛应用于DeFi、元宇宙、游戏、供应链和版权…

    2025年12月9日
    000
  • Token(代币)到底是什么?Token和Coin有何区别?

    在探讨数字资产领域时,人们经常会遇到Coin(币)和Token(代币)这两个术语。它们虽然经常被交替使用,但在技术层面、功能以及本质上存在着显著的差异。理解这两者的不同,是深入了解区块链技术应用的基础。Coin通常指的是一个特定区块链网络的原生加密货币,而Token则是在现有区块链平台上通过智能合约…

    2025年12月9日
    000
  • Token和Coin有什么区别?新手必看

    进入加密世界,新手常常会被“Coin”和“Token”这两个词搞得一头雾水。它们在新闻、交易平台和社群讨论中频繁出现,似乎可以互换使用,但实际上,它们代表着两种在技术和功能上截然不同的数字资产。理解它们之间的差异,是每一位新手建立正确认知基础的关键一步。它们各自的定义、功能和运作方式都有着本质的区别…

    2025年12月9日
    000
  • ETH预测最新分析APP推荐 以太坊行情分析软件注册安装汇总

    探索以太坊(eth)的未来价格走向,离不开专业的数据分析工具。本文将为您推荐几款主流的eth行情分析软件,并汇总其注册与安装要点,帮助您在复杂的市场环境中做出更明智的决策。这些应用程序提供实时数据、深度图表和前沿分析,是现代投资者的得力助手。 一、核心分析平台工具介绍 1、币安 (Binance):…

    2025年12月9日
    000
  • 2025年购买 ETH(以太坊)最全攻略 注册币安 + 下载 App + 交易教程

    用户可通过下载币安App、注册账户并完成实名认证后,使用P2P交易购买USDT,再兑换为ETH。教程详细指导了安卓和苹果设备的安装方法、KYC认证流程、P2P购币及现货交易步骤,并强调开启双重验证、绑定通讯方式、设置提现白名单与反钓鱼码等安全措施,确保操作安全合规。 随着加密市场回暖,ETH(以太坊…

    2025年12月9日
    000
  • LayerZero (ZRO币) 是什么?主要功能优势、代币经济学介绍

    目录 何谓LayerZero──跨链通信的未来?LayerZero 的主要功能、使用案例及优势LayerZero (ZRO) 代币用途与代币经济学ZRO 代币分配什么是1.1 亿美元的LayerZero-Stargate 合并提案?结语  layerzero (zro)是一种全链互操作性协议,旨在将…

    2025年12月9日
    000
  • 以太坊突破4600美元开启狂暴牛市:BitMine融资200亿美金,加密市场全线沸腾

    目录 BitMine史诗级融资200亿美金:机构鲸吞ETH的范式革命ETH狂暴上涨的三大引擎:机构、ETF与空头挤压比特币高位盘整:蓄力冲击13.5万美金历史峰值​​山寨币季爆发:BNB、Chainlink、Uniswap技术面突破​​狂暴牛市启幕:ETH剑指5,000美元的历史新纪 元 ‍ 亚洲时…

    2025年12月9日 好文分享
    000
  • Bullish百亿IPO光鲜的背后,是EOS社区梦碎资本游戏

    目录 42亿美元的背叛Bullish 融资10亿新起点48亿估值,是“低调”还是另有图谋? 8 月 12 日,继 coinbase 之后,第二家加密交易所将正式登陆纽约证券交易所——bullish 计划通过首次公开募股筹集约 9.9 亿美元。 表面上,这只是加密行业的又一次例行登场。过去半年 Cir…

    2025年12月9日 好文分享
    000
  • 以太坊基金会2小时抛售1694枚ETH套现772万美元,链上数据引关注

    8月13日亚洲时段凌晨,以太坊(ETH)价格强势突破4600美元,创下近三年来的历史新高,与此同时比特币也逼近12万美元大关,一场由机构资本主导的加密资产热潮正席卷全球市场。 短短四个月内涨幅高达228%的以太坊,在美股纳指与道指盘中均上涨超1%的宏观利好环境下,彻底引爆了这场“狂暴牛市”。然而,正…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信