Java中如何自定义序列化 掌握writeObject

自定义序列化是指通过实现writeobject和readobject方法,由开发者决定java对象如何转换为字节流及如何还原。1. 要实现自定义序列化,需让类实现serializable接口,并定义private的writeobject和readobject方法以控制序列化过程;2. transient关键字用于标记不参与默认序列化的字段,但可通过自定义方法手动处理;3. 为解决版本兼容性问题,应使用serialversionuid标识版本,并在结构变更时更新其值;4. 另一种方式是实现externalizable接口,通过writeexternal和readexternal方法完全手动控制序列化,同时必须提供无参构造函数;5. 避免安全漏洞的方法包括避免序列化敏感数据、使用安全库、对数据签名或加密、限制反序列化类并及时更新库。掌握自定义序列化机制有助于更灵活、安全地处理对象持久化与传输需求。

Java中如何自定义序列化 掌握writeObject

自定义序列化,简单来说,就是让你自己来决定Java对象怎么转换成字节流,以及如何从字节流还原成对象。writeObject 方法是实现自定义序列化的关键。

Java中如何自定义序列化 掌握writeObject

解决方案

要自定义序列化,你需要让你的类实现 java.io.Serializable 接口。这只是一个标记接口,告诉JVM这个类的对象可以被序列化。然后,你需要在类中定义一个 private void writeObject(java.io.ObjectOutputStream out) throws IOException 方法和一个 private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException 方法。

Java中如何自定义序列化 掌握writeObject

writeObject 方法负责将对象的状态写入 ObjectOutputStream,而 readObject 方法负责从 ObjectInputStream 读取状态并恢复对象。

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

一个简单的例子:

Java中如何自定义序列化 掌握writeObject

import java.io.*;public class MyObject implements Serializable {    private String name;    private int age;    private transient String secret; // transient 关键字,不参与默认序列化    public MyObject(String name, int age, String secret) {        this.name = name;        this.age = age;        this.secret = secret;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    public String getSecret() {        return secret;    }    private void writeObject(ObjectOutputStream out) throws IOException {        // 先执行默认的序列化        out.defaultWriteObject();        // 自定义序列化 secret 字段        String encodedSecret = encrypt(secret); // 假设encrypt方法存在        out.writeObject(encodedSecret);    }    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {        // 先执行默认的反序列化        in.defaultReadObject();        // 自定义反序列化 secret 字段        String encodedSecret = (String) in.readObject();        this.secret = decrypt(encodedSecret); // 假设decrypt方法存在    }    private String encrypt(String data) {        // 简单的加密示例,实际应用中需要更安全的加密算法        return new StringBuilder(data).reverse().toString();    }    private String decrypt(String data) {        // 简单的解密示例        return new StringBuilder(data).reverse().toString();    }    public static void main(String[] args) throws IOException, ClassNotFoundException {        MyObject obj = new MyObject("Alice", 30, "MySecret");        // 序列化        ByteArrayOutputStream bos = new ByteArrayOutputStream();        ObjectOutputStream oos = new ObjectOutputStream(bos);        oos.writeObject(obj);        oos.close();        // 反序列化        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());        ObjectInputStream ois = new ObjectInputStream(bis);        MyObject deserializedObj = (MyObject) ois.readObject();        ois.close();        System.out.println("Name: " + deserializedObj.getName());        System.out.println("Age: " + deserializedObj.getAge());        System.out.println("Secret: " + deserializedObj.getSecret()); // 解密后的 secret    }}

为什么需要自定义序列化?

默认的序列化机制可能不满足所有需求。比如,你可能想加密某些敏感数据,或者排除某些字段不被序列化(使用 transient 关键字)。自定义序列化允许你完全控制序列化的过程。另外,如果你的对象包含一些非Serializable的字段,你必须使用自定义序列化来处理这些字段。

transient 关键字的作用是什么?

transient 关键字用于标记不应该被序列化的字段。当一个字段被标记为 transient,默认的序列化机制会忽略它。这意味着在反序列化时,该字段的值将是其类型的默认值(例如,null 对于对象类型,0 对于 int 类型)。在上面的例子中,secret 字段被标记为 transient,即使没有自定义序列化,它也不会被默认序列化。但通过自定义的 writeObjectreadObject 方法,我们仍然可以控制它的序列化和反序列化。

如何处理序列化中的版本兼容性问题?

当类的结构发生变化时,例如添加、删除或修改字段,可能会导致序列化版本不兼容。为了解决这个问题,你可以使用 serialVersionUIDserialVersionUID 是一个静态常量,用于标识类的序列化版本。

智谱AI开放平台 智谱AI开放平台

智谱AI大模型开放平台-新一代国产自主通用AI开放平台

智谱AI开放平台 85 查看详情 智谱AI开放平台

private static final long serialVersionUID = 1L;

如果类的结构发生变化,你应该更新 serialVersionUID 的值。这样,当尝试反序列化旧版本的对象时,JVM会检测到版本不匹配,并抛出 InvalidClassException 异常。

如果你希望兼容旧版本,可以谨慎地添加或删除字段,并确保 readObject 方法能够正确处理旧版本的数据。通常,添加字段是相对安全的,但删除字段可能会导致反序列化失败。

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {    in.defaultReadObject();    try {        // 尝试读取新字段        this.newField = in.readObject();    } catch (java.io.OptionalDataException e) {        // 如果旧版本没有这个字段,则忽略异常        if (!e.eof) throw e;        this.newField = null; // 设置为默认值    }}

除了writeObject和readObject,还有其他自定义序列化的方式吗?

除了 writeObjectreadObject 方法,还可以实现 Externalizable 接口。Externalizable 接口继承自 Serializable 接口,但它提供了更强的控制权。当你实现 Externalizable 接口时,你需要实现 writeExternalreadExternal 方法。

import java.io.*;public class MyExternalizable implements Externalizable {    private String name;    private int age;    public MyExternalizable() {        // 必须提供一个无参构造函数    }    public MyExternalizable(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    @Override    public void writeExternal(ObjectOutput out) throws IOException {        out.writeObject(name);        out.writeInt(age);    }    @Override    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {        this.name = (String) in.readObject();        this.age = in.readInt();    }    public static void main(String[] args) throws IOException, ClassNotFoundException {        MyExternalizable obj = new MyExternalizable("Bob", 40);        // 序列化        ByteArrayOutputStream bos = new ByteArrayOutputStream();        ObjectOutputStream oos = new ObjectOutputStream(bos);        oos.writeObject(obj);        oos.close();        // 反序列化        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());        ObjectInputStream ois = new ObjectInputStream(bis);        MyExternalizable deserializedObj = (MyExternalizable) ois.readObject();        ois.close();        System.out.println("Name: " + deserializedObj.getName());        System.out.println("Age: " + deserializedObj.getAge());    }}

实现 Externalizable 接口时,需要注意以下几点:

必须提供一个无参构造函数。在反序列化时,JVM会先调用无参构造函数创建一个对象,然后再调用 readExternal 方法恢复对象的状态。你需要手动序列化和反序列化所有字段,包括父类的字段。Externalizable 接口提供了更大的灵活性,但也需要更多的代码。

如何避免序列化中的安全漏洞?

序列化和反序列化可能会引入安全漏洞,例如反序列化漏洞。攻击者可以构造恶意的序列化数据,导致在反序列化时执行任意代码。

为了避免这些漏洞,可以采取以下措施:

尽量避免序列化敏感数据。使用安全的序列化库,例如 JSON 或 Protocol Buffers。对序列化数据进行签名或加密,以防止篡改。限制可以反序列化的类,使用白名单机制。定期更新序列化库,以修复已知的安全漏洞。

总而言之,理解并掌握 Java 中的自定义序列化机制,特别是 writeObject 方法,对于编写健壮、安全、可维护的应用程序至关重要。它允许你精确控制对象的序列化和反序列化过程,从而满足各种复杂的需求。

以上就是Java中如何自定义序列化 掌握writeObject的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月25日 22:37:30
下一篇 2025年11月25日 22:37:52

相关推荐

  • 什么是API?为什么量化交易者都离不开它?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: API,全称应用程序编程接口,它就像一个软件间的“翻译官”或“信使”,允许不同的应用程序安全、高效地相互通信和交换数据。它是实现程序化、自动化操作的核心技术基石,让…

    2025年12月9日
    000
  • 什么是“蜜罐”骗局?为什么有些币只准买入不准卖出?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 在加密货币领域,“蜜罐”(Honeypot)骗局是一种精心设计的欺诈手段。骗子通过发行一种新代币,利用虚假宣传吸引投资者购买,但其智能合约中暗藏玄机,导致投资者只准…

    2025年12月9日
    000
  • 虚拟币排行榜20名最新2025年 10月数字货币前20榜单

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 2025年10月,数字货币市场预计将呈现更加多元和成熟的格局。本榜单基于当前技术演进、生态系统建设、市场应用和社区共识进行前瞻性预测,旨在揭示那些可能在未来市场中占…

    2025年12月9日
    000
  • 什么是跨链桥?如何将资产从一条链转移到另一条链?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 跨链桥是一种连接独立区块链的“桥梁”,它允许用户将资产或数据从一个区块链网络(如以太坊)安全地转移到另一个网络(如Solana),解决了不同链之间的孤岛问题,极大地…

    2025年12月9日
    000
  • 什么是资金费率?为什么玩合约有时候需要付费给别人?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 资金费率是永续合约中的核心机制,它的存在是为了确保合约市场的价格能紧密跟随标的资产的现货价格。这笔费用并非由交易所收取,而是在多空双方的交易者之间直接结算,它就像一…

    2025年12月9日
    000
  • 什么是“HODL”和“钻石手”?币圈人为什么总说要“拿住”?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 在加密货币世界里,“HODL”和“钻石手”是投资者们常挂在嘴边的词。它们代表着一种坚定的持币信念,即无论市场如何剧烈波动,都选择长期持有资产,相信其未来价值。 “H…

    2025年12月9日
    000
  • 什么是“创世区块”?它对比特币有什么特殊的意义?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 创世区块,又称区块0,是比特币区块链中第一个被创建的区块。它由中本聪在2009年1月3日创建,是整个比特币系统的基石,所有后续区块都直接或间接地链接到它,犹如一部史…

    2025年12月9日
    000
  • 中心化交易所(CEX)与去中心化交易所(DEX)对比

    在数字资产交易的广阔天地中,中心化交易所(cex)和去中心化交易所(dex)是两种主流的平台类型,它们各自拥有独特的优势和局限性。理解两者的核心差异,对于投资者来说至关重要,因为它直接影响到交易的安全性、便捷性以及所能提供的资产种类。本文将深入探讨cex和dex的运作机制、特点以及它们在实际应用中的…

    好文分享 2025年12月9日
    000
  • 什么是Gas费?为什么转账有时那么贵,如何节省?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: Gas费是区块链网络上的交易手续费,就像汽车的燃油。它用于支付给验证者处理和验证交易的报酬,是确保网络安全与稳定运行的核心机制。 为什么转账有时那么贵? 1、网络拥…

    2025年12月9日
    000
  • 美联储10月降息概率达99%,加密市场迎来政策关键周

    美联储降息预期达99%叠加SEC批准加密ETP新规,美元走弱与监管明确化推动资产重配,黄金、美股成长板块及加密货币迎来利好,机构加速布局数字资产,市场进入流动性宽松与制度创新共振的新阶段。 2025年10月的第三周,全球金融市场正屏息凝视,等待一个几乎确定无疑的货币事件——美联储的再次降息。根据CM…

    2025年12月9日
    000
  • 如何查看比特币交易记录_查询比特币交易记录的步骤

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 查询比特币的交易记录是了解资金流向和确认交易状态的关键一步。由于其网络的公开透明特性,任何人都可以通过使用区块链浏览器轻松追踪任何一笔交易的详细信息。 一、准备查询…

    2025年12月9日
    000
  • 交易所:加密货币交易的核心平台

    在数字经济浪潮中,加密货币以其去中心化、透明可追溯的特性,正逐步重塑全球金融格局。作为连接用户与加密世界的桥梁,加密货币交易所扮演着至关重要的角色。它们不仅是数字资产买卖流通的场所,更是价值发现、风险管理、生态建设的核心驱动力。面对琳琅满目的交易所,如何选择一个安全可靠、功能强大、服务优质的平台,成…

    好文分享 2025年12月9日
    000
  • 2025年10月底可能暴涨的币有哪些

    评估潜在暴涨币种的关键因素 在探讨2025年10月底可能暴涨的币种之前,理解评估加密货币的关键因素至关重要。这些因素帮助我们筛选出那些具有真正潜力的项目,而不是盲目追逐短期热点。 技术创新与应用场景: 一个具有颠覆性技术和广泛应用场景的项目,其成功的可能性更大。例如,解决了现有区块链痛点(如扩容、隐…

    好文分享 2025年12月9日
    000
  • 狗狗币蓄势待发:0.2 只是起点,1 美元是底线,下一站直接奔 10 美元?!

    在加密货币的世界里,从来不缺少奇迹,而狗狗币(dogecoin)无疑是其中最引人注目的角色之一。从最初的玩笑诞生,到如今成为市场焦点,狗狗币用其独特的社区文化和惊人的价格波动,一次次证明了自己的价值。近期,随着市场情绪的回暖和一系列利好消息的推动,狗狗币似乎正在蓄势待发,准备开启新一轮的上涨征程。许…

    2025年12月9日
    000
  • 比特币到底是谁发明的?中本聪与区块链起源

    Binance币安 欧易OKX ️ Huobi火币️ 比特币的发明者是中本聪(Satoshi Nakamoto),这是一个化名,真实身份至今未知。2008年11月1日,中本聪在互联网上发表了一篇题为《比特币:一种点对点的电子现金系统》的白皮书,系统性地阐述了比特币的运行机制。这篇论文不仅提出了比特币…

    2025年12月9日
    000
  • 币安Alpha10月20日上线项目SVSA介绍

    Binance币安 欧易OKX ️ Huobi火币️ SVSA 是 Kaia 生态的重点游戏项目,估值高达五千万,背靠日韩双巨头,预计16:00上线 Alpha,上线平台不多,大概率会走单机拉盘路线。 项目简介:SVSA 是一款由 KaiaChain 支持、登陆 LINE DApp 平台的 Web3…

    2025年12月9日
    100
  • MEME币、AI币、GameFi项目怎么选?

    Binance币安 欧易OKX ️ Huobi火币️ 选什么类型的币,其实取决于你自己的目标和风险偏好。MEME币、AI币、GameFi项目各有特点,不能一概而论哪个最好,关键看你怎么理解和参与。 MEME币:情绪驱动,快进快出 MEME币的核心不是技术或应用,而是共识和热度。它的涨跌往往跟社交媒体…

    2025年12月9日
    100
  • 彭博社特稿:币安(BINANCE)劲敌,一文读懂 Hyperliquid 如何成功抢占市场份额

    由少数工程师团队打造的匿名去中心化交易所hyperliquid,在短短两年间已吸引重量级投资者并实现千亿级交易量。该平台专注于永续合约交易,永续合约是一种无到期日的合约,占据加密货币投机市场主导地位,月交易量超6万亿美元。 Binance币安 欧易OKX ️ Huobi火币️ 虽与行业龙头币安规模悬…

    2025年12月9日
    000
  • 2025年BTC价格预测:未来十年走势分析与五大关键因素解读

    随着比特币第三次减半周期进入关键阶段,btcc分析师团队结合链上数据、宏观经济环境和技术指标,对2025-2035年比特币价格走势进行深度研判。本文包含:1)当前价格关键支撑位分析;2)影响长期走势的五大内核因素;3)机构投资者最新持仓动态;4)十年周期价格预测模型。 Binance币安 欧易OKX…

    2025年12月9日
    000
  • 比特币的存量流量模型是什么?一文介绍

    存量-产量比是一种量化资产稀缺性的数学模型。它源于古老的商品分析,用于研究供应趋势如何决定未来的价格。本文试图将一项资产的当前存量(即当前库存量)与其流量(即每年进入市场的添加供应量)进行对比。 Binance币安 欧易OKX ️ Huobi火币️ 从数学上讲,存量产量比衡量的是按当前生产速度生产当…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信