java对象序列化与反序列化中的构造方法问题

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
老规矩,先上代码再总结:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class main {
	public static void main(String[] args)throws IOException, ClassNotFoundException{
		ObjectOutputStream oos=new ObjectOutputStream(
				new FileOutputStream("employee.dat"));
		Foo2 foo2=new Foo2();
		oos.writeObject(foo2);
		oos.flush();
		oos.close();
		ObjectInputStream ois=new ObjectInputStream(
				new FileInputStream("employee.dat"));
		Foo2 foo21= (Foo2)ois.readObject();
		
		System.out.println(foo21);
		ois.close();
	}
}
class Foo {
	public Foo(){
		System.out.println("foo...");
	}
}
class Foo1 extends Foo implements Serializable{
	public Foo1(){
		System.out.println("foo1...");
	}
}

class Foo2 extends Foo1{
	public Foo2(){
		System.out.println("foo2...");
	}
}

天啦噜,这段代码好长好长。

怎么说呢?大家先看看运行结果吧:

通过上面的内容,我们可以总结出java对象序列化与非序列化时子父类构造方法的调用法则:

1.在序列化过程中,构造可序列化的子类对象时总要递归调父类的构造方法;

2.在反序列化过程中,构造子类对象时总是只显示调用(该子类及其不可序列化父类)的构造方法;

注意这里的括号,明白我的意思吧,我这人嘴笨,可能解释不清楚,大家见谅。


java安全(五)java反序列化 序列化 在调用RMI时,发现接收发送数据都是反序列化数据. 例如JSON和XML等语言,在网络上传递信息,都会用到一些格式化数据,大多数处理方法中,JSON和XML支持的数据类型就是基本数据类型,整型、浮点型、字符串、布尔等,如果开发者希望在传输数据的时候直接传输一个对象,那么就不得不想办法扩展基础的JSON(XML)语法。比如,Jackson和Fastjson这类序列化库,在JSON(XML)的基础上进行改造,通过特定的语法来传递对象. RMI使用java等语言内置的序列化方法,将一个对象转化成一串二进制 阅读详情

相关推荐

Java中的序列化反序列化

序列化(Serialization)反序列化(Deserialization)是编程中常见的两个概念,它们主要涉及到将数据结构或对象状态转换为可以存储或传输的格式,以及将存储或传输的格式转换回原始的数据结构或对象状态的过程。这两个过程在数据持久化、网络通信、对象深拷贝等多个场景中发挥着重要作用。

yuiezt的专栏 4215

Java学习笔记(十三)--序列化反序列化无参构造函数

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 概念 序列化:将对象保存到磁盘中,或允许在网络中直接传输对象,对象序列化机制允许把内存中的Java对象转换成平台无关的二进制,从而可以持久的保存在磁盘上,也可以在网络中传输。 反序列化:程序一旦获得了序列化对象,则这种二进制流都可以恢复成原来的 如何实现序列化 1.Ser...

至尊宝 3万+

SpringBoot实战:解决JwtUser反序列化问题

而在一些情况下,我们可能会遇到JwtUser反序列化问题,导致无法正确地将JwtUser对象从JSON字符串转换为Java对象。在Spring Security中,JwtUser一般实现了UserDetails接口,同时需要实现Serializable接口以支持对象序列化反序列化。造成这个问题的原因很多,可能是由于JwtUser类的字段发生了化,或者是缺少了无参构造方法等。希望本文对你有所帮助!通过以上修改,我们可以保证旧的JSON字符串能够正确地反序列化为新的JwtUser对象

Byte_O_O的博客 305

java 序列化 构造函数_java-在序列化反序列化期间如何调用构造函数

java-在序列化反序列化期间如何调用构造函数?在序列化反序列化期间如何调用构造函数当有一个类实现可序列化时?当存在父/子关系并且只有子级实现可序列化时?当存在父子关系并且父子都实现可序列化时?Rekha asked 2020-02-07T23:12:09Z6个解决方案43 votes反序列化期间,将为未实现Serializable的继承层次结构中的第一个类调用可访问的默认构造函数。>可...

weixin_33670640的博客 809

java反序列化 构造函数_在Java反序列化时是否调用对象中的构造函数

Java中,序列化是一个概念,通过它我们可以将对象的状态写入字节流,以便我们可以通过网络(使用JPA和RMI等技术)传输它。序列化对象-确保该类实现了Serializable接口。创建一个FileOutputStream对象,该对象表示要将对象存储到的文件的文件(抽象路径)。通过传递上面创建的FileOutputStream对象来创建ObjectOutputStream 对象。使用writeOb...

weixin_42322512的博客 2257

序列化反序列化:基础原理

JAVA中的序列化反序列化主要用于:(1)将对象或者异常等写入文件,通过文件交互传输信息;(2)将对象或者异常等通过网络进行传输。那么为什么需要序列化反序列化呢?简单来说,如果你只是自己同一台机器的同一个环境下使用同一个JVM来操作,序列化反序列化是没必要的,当需要进行数据传输的时候就显得十分必要。比如你的数据写到文件里要被其他人的电脑的程序使用,或者你电脑上的数据需要通过网络传输给其他人的程序使用,像服务器客户端的这种模型就是一种应用,这个时候,大家想想,每个人的电脑配置可能不同,运行环境可能也不同

张将军的博客 775

序列化反序列化

序列化: 持久化(对象序列化)技术: 把内存中数据 写入到存储介质(文件)中 反序列化: 把文件中的数据恢复成内存对象, 反序列化 读进来 1. 被序列化的类型要实现 Serializable接口 , Serializable接口 没有方法 2. 反序列化对象的时候并未调用构造方法 3. 所有的成员量类型都要实现Serializable接口, 对象才能被序列化 4. 如果某个成员量使用transient修饰后 表示在进行序列化的时候忽略此成员量的值, 那么发序列化的时候;...

qq_42536809的博客 146

Day7-java反序列化

java终于又开始了,我爱java 吹爆p牛的java安全漫谈-入门超友好 参考了: https://zhishihezi.net/b/5d644b6f81cbc9e40460fe7eea3c7925 序列化反序列化 RMI(Java远程方法调用-Java Remote Method Invocation)和JMX(Java管理扩展-Java Management Extensions) 具有广泛而深刻的利用。 0x01 序列化反序列化 实现的方法很简单,只要实现了java.io.Serializa.

anwen12的博客 586

对象序列化反序列化详解

Java对象序列化时参序列化的内容包含以下几个方面:1.属性,包括基本数据类型、数组以及其他对象的引用; 2.类名。不能被序列化的内容有以下几个方面:1.方法。 2.有static修饰的属性。 3.有transient修饰的属性。在序列化过程中不仅保留当前类对象的数据,而且递归保存对象引用的每个对象的数据。将整个对象层次写入字节流中,这也就是序列化对象的“深复制”,即复制对象本身及引用的对象

小小默:进无止境 6652

java对象序列化反序列化

引言 在学习IO流时,我们会学到一个序列化流,和反序列化流,相信不少小伙伴学到这个是有些懵的,今天就带大家来了解一下java对象序列化反序列化流 目录 一、什么是java对象序列化反序列化流 二、对象序列化 三、对象反序列化流 四、对象序列化中我们容易遇到的集合小问题 一、什么是java对象序列化反序列化流 - 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象 Java 提供了一种对象序列化的机制...

秋雨绵绵 1032

Java对象序列化反序列化

一、为什么要进行序列化 再介绍之前,我们有必要先了解下对象的生命周期,我们知道Java中的对象都是存在于堆内存中的,而堆内存是可以被垃圾回收器不定期回收的。从对象被创建到被回收这一段时间就是Java对象的生命周期,也即Java对象只存活于这个时间段内。 对象被垃圾回收器回收意味着对象对象中的成员量所占的内存也就被回收,这意味着我们就再也得不到该对象的任何内容了,因为已经被销毁了嘛,当然我们

yaozq的android开发 1万+

【潜意识JavaJava中的序列化反序列化

朋友,在 Java 开发里,序列化反序列化可是相当重要的概念。想象一下,你要把一个复杂的 Java 对象从一台机器传输到另一台机器,或者把它存储到磁盘里,这时候该咋办呢?序列化反序列化就派上大用场啦。我在项目里处理数据传输和存储的时候,没少和它们打交道,现在就把我的经验分享给你。

潜意识Java的博客 1042

Java对象序列化反序列化

Java对象转换为字节序列的过程称为序列化,用途是对象永久保存、传输。序列化运行时使用一个称为 serialVersionUID 的版本号每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了序列化兼容的类。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。

buger的专栏 5481

Java对象的转移——序列化反序列化

序列化反序列化是现代软件开发中用于数据传输、存储的基本技术,尤其在分布式系统、缓存系统和跨语言数据交换中应用广泛。综上所述,序列化反序列化技术的发展,为现代软件提供了多样化的数据传输和持久化方案。通过合理选择合适的序列化工具,可以优化系统的性能、安全性和兼容性,从而满足不同应用的需求。序列化的技术不仅限于Java,在很多语言和框架中都有类似实现,适用于不同的应用需求。Protobuf的二进制格式占用空间小,解析速度快,版本控制友好,是数据高效传输的理想选择,尤其在微服务和多语言系统中应用广泛。

m0_53926113的博客 1699

【潜意识JavaJava对象序列化反序列化

简单来说,对象序列化是将 Java 对象转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输。而反序列化则是相反的操作,将字节流重新转换回 Java 对象,恢复其在内存中的状态。想象你有一个精美的乐高模型,要暂时收起来或者送给远方的朋友。序列化就像是把这个模型拆分成一个个小块,打包成便于运输的包裹;反序列化则是收到包裹后,按照说明重新把这些小块组装成原来的乐高模型。在 Java 里,对象就如同乐高模型,字节流是包裹,通过序列化反序列化对象能在不同环境中实现存储还原。

潜意识Java的博客 1033

Java 中的​​序列化​​反序列化

若需要控制序列化/反序列化的细节(如加密、压缩),可通过重写和方法实现。若需要对敏感字段(如密码)进行加密存储,可通过重写和readObject方法自定义序列化过程。​​定义SecureUser类(自定义序列化)​​:java复制// 敏感字段,不直接序列化// AES 密钥(16字节)// 自定义序列化逻辑(加密密码)// 默认序列化非 transient 字段(username)try {// 加密密码// 写入加密后的密码。

zjw541806的博客 956

Java对象数组序列化反序列化

先创建一个Java Bean /**一个low的Java Bean*/ public class Box implements Serializable{ private int width; private int height; public Box(){ } public Box(int width,int height){ this.wid

剑尚未佩妥 5711
上一篇: JAVA之字节缓冲流
下一篇: 你以为在java里用synchronized就能万事大吉了吗?
Deep_Mind
博客等级 码龄10年 3粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值