多次重复序列化同一对象的踩坑点 --《JAVA编程思想》87

解决JAVA使用@JsonProperty序列化出现字段重复问题(大写开头的字段重复序列化) 需求: JSON序列化时,使用@JsonProperty注解,将字段名序列化为首字母大写,兼容前端和第三方接口。问题:序列化出现字段重复问题。 阅读详情

假设我们在序列化中,对一个对象进行多次序列化,反序列化是会是单个还是多个对象呢?先来看一个例子。

public class Pet implements Serializable {

    private String name;

    public Pet(String name) {
        this.name = name;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //构建序列化集合
        ArrayList<Pet> pets = new ArrayList<>();
        pets.add(new Pet("dog"));
        pets.add(new Pet("cat"));
        pets.add(new Pet("pig"));
        System.out.println("------打印初始集合------");
        System.out.println(pets);
        //第一次构建输出流
        ByteArrayOutputStream bout1 = new ByteArrayOutputStream();
        ObjectOutputStream out1 = new ObjectOutputStream(bout1);
        //第一次写入集合
        out1.writeObject(pets);
        System.out.println("------变更集合内容------");
        //变更集合后第二次写入
        pets.add(new Pet("sheep"));
        System.out.println(pets);
        out1.writeObject(pets);
        ObjectInputStream in1 = new ObjectInputStream(new ByteArrayInputStream(bout1.toByteArray()));
        ArrayList<Pet> pets1 = (ArrayList<Pet>) in1.readObject();
        ArrayList<Pet> pets2 = (ArrayList<Pet>) in1.readObject();
        System.out.println("------读取第一次写入的集合------");
        System.out.println(pets1);
        System.out.println("------读取第二次写入的集合------");
        System.out.println(pets2);
        ByteArrayOutputStream bout2 = new ByteArrayOutputStream();
        ObjectOutputStream out2 = new ObjectOutputStream(bout2);
        //第三次写入集合
        out2.writeObject(pets);
        //第四次写入集合
        out2.writeObject(pets);
        ObjectInputStream in2 = new ObjectInputStream(new ByteArrayInputStream(bout2.toByteArray()));
        ArrayList<Pet> pets3 = (ArrayList<Pet>) in2.readObject();
        ArrayList<Pet> pets4 = (ArrayList<Pet>) in2.readObject();
        System.out.println("------读取第三次写入的集合------");
        System.out.println(pets3);
        System.out.println("------读取第四次写入的集合------");
        System.out.println(pets4);
        //关闭流
        bout1.close();
        bout2.close();
        out1.close();
        out2.close();
        in1.close();
        in2.close();
    }
    
}

------打印初始集合------
[mtn.baymax.charpter18.Pet@1b6d3586, mtn.baymax.charpter18.Pet@4554617c, mtn.baymax.charpter18.Pet@74a14482]
------变更集合内容------
[mtn.baymax.charpter18.Pet@1b6d3586, mtn.baymax.charpter18.Pet@4554617c, mtn.baymax.charpter18.Pet@74a14482, mtn.baymax.charpter18.Pet@511d50c0]
------读取第一次写入的集合------
[mtn.baymax.charpter18.Pet@3feba861, mtn.baymax.charpter18.Pet@5b480cf9, mtn.baymax.charpter18.Pet@6f496d9f]
------读取第二次写入的集合------
[mtn.baymax.charpter18.Pet@3feba861, mtn.baymax.charpter18.Pet@5b480cf9, mtn.baymax.charpter18.Pet@6f496d9f]
------读取第三次写入的集合------
[mtn.baymax.charpter18.Pet@10f87f48, mtn.baymax.charpter18.Pet@b4c966a, mtn.baymax.charpter18.Pet@2f4d3709, mtn.baymax.charpter18.Pet@4e50df2e]
------读取第四次写入的集合------
[mtn.baymax.charpter18.Pet@10f87f48, mtn.baymax.charpter18.Pet@b4c966a, mtn.baymax.charpter18.Pet@2f4d3709, mtn.baymax.charpter18.Pet@4e50df2e]

从打印结果可以看出,在反序列化时,重复序列化出来的对象指向的都是同一个内存地址,证明反序列化时并不会复制相同的对象。

但这里值得注意的是,当我们第一次对 pets 序列化后,新增了第4个 Pet 类型,然后进行了第二次序列化,但第二个 pets 仍然指向了第一次序列化时的对象状态,仅仅保存了3个 Pet 类型,后续做出的修改并没有在之后的序列化中得到保存。

但重新创建了新的输出流 bout2 后,pets 的最新状态得以完整序列化。

故我们在使用序列化时:在一个输入流中,同一个对象只序列化一次,在一个输出流中,同一个对象只反序列化一次即可。


本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

<IBM AIX> 《HACMP 实用手册和命令 HA切换手册》 - 鸿篇巨制,全网最全 操作命令检查磁盘预留策略要将磁盘预留策略更改为 no_reserve集群状态实用程序查看集群状态是否正常SMIT System Management (C-SPOC)Cluster ServicesShow Cluster Services 面板上的选项或 lssrc 命令查看资源组、资源组对应的VG、资源组对应的APPLICATION SERVER# ./cldispsmit常用命令F3退出F4列表Esc+6或者F6查看命令Esc+7或者F7选择多项检查状态。 阅读详情

相关推荐

理想汽车智驾方案介绍 4 World model + 强化学习重建自动驾驶交互环境

本帖将以 DrivingSphere 为例来解析这个过程。

地平线开发者 1920

JAVA在序列化时使用@JsonProperty出现字段重复序列化

项目场景:需要将JavaBean序列化为首字母大写传入Redis,供给前端使用WebSocket取值。

qq_45523430的博客 1478

【第三只眼:Oracle通过归档日志查看系统的业务高峰sql】

根据oracle归档的业务高峰量,查找业务sql,进行优化

霍然的专栏 578

java序列化多次序列化到同一个文件及反序列化的问题[转载]

java序列化多次序列化到同一个文件及反序列化的问题[转载] java序列化反序列化Serilizableinvalid type code: AC 这几天上班看了点java的基础知识点,看到介绍序列化的基本问题是都是以介绍序列化一个和反序列化一个对象为例的,依此就想到了要是序列化一次多个序列化对象,再或者不同时间多次序列化对象怎么做,于是动手试了下,发现了不少问题

xiaomsds的专栏 1070

ST7789T3与CST816D驱动全解析,面试技巧第11篇:嵌入式面试场景问答 10 连发。

SPI模式下,SCLK、MOSI、CS、DC、RST为必需引脚;8080模式下需连接D0-D7、WR、RD等信号线。CST816D触摸芯片通常通过I2C接口通信,需连接SCL、SDA及INT(中断)引脚。确保电源引脚(VCC、GND)稳定供电,ST7789T3典型工作电压为3.3V。显示异常时检查时序参数,如SPI时钟频率(建议≤40MHz)、数据建立时间。初始化流程需发送一系列命令序列,包括设置像素格式、扫描方向、帧率控制等。扫描方向(MADCTL)可调整显示旋转角度,需根据实际硬件布局配置。

a967gsvj的博客 374

Android 17为什么会重写MessageQueue

DeliQueue 通过消除 MessageQueue 中的锁,提升了系统和应用的性能。合成基准测试: 得益于并发能力的提升(Treiber 栈)和更快的插入速度(最小堆),向繁忙队列进行多线程插入的速度比传统 MessageQueue 快了高达 5000 倍。Perfetto 追踪分析: 在从内部测试人员处获取的 Perfetto 追踪记录中,我们看到应用主线程在锁竞争上消耗的时间减少了 15%。

xiangzhihong8的专栏 269

java序列化多次序列化到同一个文件及反序列化的问题

这几天上班看了点java的基础知识点,看到介绍序列化的基本问题是都是以介绍序列化一个和反序列化一个对象为例的,依此就想到了要是序列化一次多个序列化对象,再或者不同时间多次序列化对象怎么做,于是动手试了下,发现了不少问题,由于是小菜搞了好久上网找,才得以解决问题,废话不多说了,下面直接进入正题。 (一).java序列化的基本原理知识 参考转自:http://yuyimin...

tengyue5i5j的专栏 880

基于Simulink的光伏-储能-柴油机混合微网仿真

摘要:本文基于Simulink平台构建光伏-储能-柴油机混合微网仿真模型,实现可再生能源与备用电源的协同控制。通过光伏优先、储能调节、柴油机兜底的规则控制策略,在24小时仿真中验证了系统在晴天、阴天和夜间三种典型工况下的运行性能。模型采用PVArray模块模拟光伏发电,Simscape电气库构建储能系统,自定义MATLAB函数实现柴油机启停逻辑和能量管理。仿真结果显示系统功率平衡误差<5%,储能SOC维持在20%-80%,柴油机日均运行时间<4小时,满足设计指标。文章详细说明了建模步骤、参数设置

xiaoheshang_123的博客 68

Java序列化(创建可重复用的Java对象)

保存(持久化)对象及其状态到内存或磁盘 Java平台允许我们在内存中创建可重用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即 这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮我们实现该功能。 序列化对象以字节数组保持-静态成员不保存 使用J...

WLiiii的博客 1394

智驾芯片&软件分层&测试

智能驾驶相关的芯片,软件分层,测试相关内容

天赐好车的博客 436

在SAP系统中,公司间关联交易(Intercompany Transactions)或内部往来主要有三种经典的实现模式。这些模式的选择取决于企业的业务复杂度、自动化需求以及对实时性的要求

SAP系统中公司间关联交易的三种实现模式分析:1)手工记账模式(FB60/FB70)适用于低频交易,灵活性高但易出错;2)SD/MM跨公司销售采购模式(VA01/VF01/ME21N)适用于真实业务流转,业务财务集成度高;3)自动清算模式(F.13/ICR)适合高频交易集团企业,支持实时自动对账。关键成功要素包括正确配置贸易伙伴字段、统驭科目及专用凭证类型。建议根据企业规模、业务复杂度及自动化需求选择合适模式,其中大型集团优先考虑自动对账方案以确保合并报表准确性。

金牌架构师 552

如何解决循环引用的问题

循环引用是指在对象之间存在相互引用的情况。具体来说,当一个对象A引用了另一个对象B,而对象B又引用了对象A,它们之间形成了一个循环引用关系。

Wzill 2825

YOLOv11改进 | 添加注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

这篇文章给大家带来的改进机制是一个汇总篇,包含一些简单的注意力机制,本来一直不想发这些内容的(网上教程太多了,发出来增加文章数量也没什么意义),但是群内的读者很多都问我这些机制所以单独出一期视频来汇总一些比较简单的注意力机制添加的方法和使用教程,本文的内容不会过度的去解释原理,更多的是从从代码的使用上和实用的角度出发去写这篇教程。欢迎大家订阅我的专栏一起学习YOLO!YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、GAM2.1 GAM的介绍2.2 GAM的核心代码。

Snu77的博客 5152

.NET(C#) 去除JSON字符串反序列化对象列表中重复对象

本文主要介绍.NET(C#)中,通过JSON字符串生成的对象列表中重复对象的去重的方法,以及相关的示例代码。 原文地址:.NET(C#) 去除JSON字符串反序列化对象列表中重复对象

m0_60105488的博客 660

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

对象序列化时重复对象的问题解决

参考贴: https://blog.youkuaiyun.com/z714359830/article/details/51527066 使用的阿里的fastjson,其实不限于这个工具,其他序列化json的工具也是如此的。上面帖子最后说的我贴出来,比较受用: 关闭FastJson的引用检测(不推荐) 1 JSON.toJSONString(object, S...

rainyspring4540的专栏 1192

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java序列化 id_【java基础知识】【java序列化与反序列化及序列化ID】

今天上午学习了java序列化与反序列化及serialVersionUID的用处。一、序列化与反序列化的作用:对象的序列化主要有两种用途:1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;2) 在网络上传送对象的字节序列。因为不对对象序列化的化容易出现很多问题,所以引入了序列化解决了这些问题。对象序列化包括如下步骤:1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输...

weixin_31321851的博客 494

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java序列化,看这篇就够了

一、序列化的含义、意义及使用场景二、序列化实现的方式1、Serializable1.1 普通序列化1.2 成员是引用的序列化1.3 同一对象序列化多次的机制1.4 java序列化算法潜在的问题1.5 可选的自定义序列化2、Externalizable:强制自定义序列化3、两种序列化对比三、序列化版本号serialVersionUID四、总结 一、序列化的含义、意义及使用场景 序列化:将对象写入到IO流中 反序列化:从IO流中恢复对象 意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些

liqingtx的专栏 331

java序列防重复_避免Java反序列化中的重复对象

我有两个列表(list1和list2)包含对某些对象的引用,其中一些列表条目可能指向同一个对象.然后,由于各种原因,我将这些列表序列化为两个单独的文件.最后,当我反序列化列表时,我想确保我不会重新创建超出需要的对象.换句话说,List1的某些条目仍然可以指向与List2中的某个条目相同的对象.MyObject obj = new MyObject();List list1 = new ArrayL...

weixin_29865939的博客 319

json字符串 多次转义 \“,java解析

举例: "{\"code\":\"OK\",\"msg\":\"success\",\"data\":{\"userId\":\"8a71e38b7723c77e56a2001b\",\"rootId\":\"0000000000\",\"status\":\"1\",\"certification\":\"L1\",\"roles\":[{\"code\":\"1\",\"roleId\":\"1\",\"name\":\"普通角色\",\"memo\":\"默认角色\"}]},\"mm\":false}

Songbl_的博客 2071

字符串的序列化

字符串的序列化用来处理字符串的交流信息,例如,当我们去把Xml文件中的字符串读取出来,或则把字符串写到Xml文件里面去;又或则,当我们需要写程序与服务器交流,这时候我们要处理json格式的字符串 。这些都需要用到字符串的序列化。这个是很必要的。接下来总结一下常用的字符串序列化知识。  序列化 知识点 -> 序列化就是格式化,是指将一个对象以某种格式进行呈现 -> 二进制序列化 -> 在需要

wsliulian的专栏 1万+

JSON 序列化与反序列化

JSON 简介 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 语法 1.对象表示为键值对,数据由逗号分隔,花括号保存对象,方括号保存数组。 2、json六种数据类型 字符串 :"...

wish910908_的博客 604

关于两次序列化,json字符串多出\的问题

 遇到很多次这种问题了,做个记录。   当你调dubbo服务或者给前端返回json字符串时,需要序列化,再进行传递,如果json字符串经过两次序列化,会在各个属性前多出\, 特别要注意的是@ResponseBody这个标签,会在你给前端返回json字符串时自动序列化,从而出现上述问题,解决办法当然可以让你调用的服务直接给你返回一个对象而不是json字符串,另外一种是自己动手用JSON.pars...

Hilite的博客 8067

java不同类序列化同一个对象_Java序列化

含义、意义使用场景序列化:将对象写入到IO流中反序列化:从IO流中恢复对象意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。使用场景:所有可在网络上传输的对象都必须是可序列化的,比如RMI(remote method invoke,即远程方法调用),传入的参数或返回...

weixin_39788572的博客 766

spring组件 RestTemplate + @ResponseBody 使用心得

为什么80%的码农都做不了架构师?>>> ...

weixin_33768481的博客 546

Spring Boot优雅整合Swagger2,自动生成在线文档

Spring Boot优雅整合Swagger2,自动生成在线文档 日常求赞,感谢老板。 欢迎关注公众号:其实是白羊。干货持续更新中… 一、前言 现在的很多项目都是前后端分离的,后端提供接口,前端调用接口,在这个过程中一般后端会向前端提供一份接口文档,但是随着程序的调整,我们还要不断的去迭代接口文档,最后可能会搞出一堆,写起来比较耗时且在规范性上也很难要求。在这个前提下我们可以选择Swagger加入到我们的项目中。 Swagger提供了很多的功能,其中Swagger UI和Swagger Inspect

zll_zll_zll_zll的博客 283

Java 多次序列化对象到同壹個文件及反序列化的问题

这几天上班看了点 Java 的基础知识点,看到介绍序列化的基本问题是都是以介绍序列化对象和反序列化对象为例的,依此就想到了:要是壹次序列化多个对象,再或者不同时间多次序列化对象,应该怎么做,于是动手试了下,发现了不少问题,由于是小菜搞了好久上网找,才得以解决问题,废话不多说了,下面直接进入正题。 (壹)java序列化的基本原理知识:[url=http://yuyiming.iteye.com...

互联网那些事 725
上一篇: 对象序列化时屏蔽字段 --《JAVA编程思想》86
下一篇: 静态字段如何序列化? --《JAVA编程思想》88
BaymaxCS
博客等级 码龄9年 61粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaymaxCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值