java的序列化机制(一)

Java序列化的机制原理(一) 文章目录引言正文一、序列化算法一般步骤二、名词解释三、序列化后数据四、相关数据解释五、数据结构解析(子类及父类)六、对对象属性的值进行解析总结 引言 序列化是Java开发中不可或缺的一部分,对于大多数开发人员也是非常熟悉,使用频繁。在项目中的使用场景也很多,例如:数据持久化保持、项目内不同服务间通信、Redis缓存等。所以需要开发人员掌握这方面的知识,本文就实现Serializable接口,来进行... 阅读详情

    好久没有写博客了,前几天陆续的把草稿箱里的文章发出来,这篇也是比较早了,说来惭愧

说到序列化,容易跟一个词搞混“持久化”,在很长的一段时间内我也曾将序列化和持久化的概念弄混淆,那什么是持久化还有序列化呢。

1)持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件等。对象持久化的重点在于如何将业务数据对象存储在持久化介质上,并同时提供查询修改的手段。

2)什么是序列化

        简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

        Java序列化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的串行化机制是RMI、EJB等技术的技术基础。用途:利用对象的序列化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态,在分布式环境中可能需要将Object从这一端网络或设备传递到另一端。Java序列化API提供一种处理对象序列化的标准机制。

        二:序列化的实现
一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。
对象的默认序列化机制:序列化时,对象的类、类的签名,以及类及其所有超类型的非瞬态(non-transient)和非静态(non-static)字段的值都将被写入。逆序列化时,对象的类、类的签名,以及类及其所有超类型的非瞬态(non-transient)的对象都将被读取。如果我们想某个成员变量不被序列化,可以在其前面加入transient关键字
import java.io.Serializable;

/**
 * 实现一个可以被序列话的类
 */
public class Person implements Serializable {
	/** 姓名*/
    public String name;
    /** 性别*/
    public String sex;
    /** 年龄*/
    public int age;
    /**静态变量*/
    public static String test1;
    /**如果用transient声明一个实例变量,当对象存储时,它的值不需要维持*/
    public transient String test2;
    /**构造器*/
    public Person(String name,String sex,int age) {
    	System.out.println("构造器");
    	this.name=name;
    	this.sex=sex;
    	this.age=age;
    	Person.test1=this.name;
    	this.test2=this.sex;
    }

}
再写一个测试类
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;


public class Test
{
    public static void main(String[] args)
    {
    	Person per=new Person("优快云", "男", 11);
        try
        {
        	//序列化该对象
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c:\\a.data"));
            out.writeObject(per);
            out.flush();
            out.close();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        try
        {
        	//反序列化对象
            ObjectInputStream in = new ObjectInputStream( new FileInputStream("c:\\a.data"));
            per = (Person) in.readObject();
            in.close();
        }
        catch (Exception e)
        {
        	e.printStackTrace();
        }
        Test test=new Test();
        test.printObj(per);
    }
    /**
	 * 打印对象
	 */
	public void printObj(Object obj){
		try {
			Class cla=obj.getClass();
			Field[] fields=cla.getDeclaredFields();
			StringBuffer sb=new StringBuffer("{");
			for(Field field:fields){
				sb.append(field.getName()+"="+field.get(obj)).append(",");
			}
			sb.append("}");
			System.out.println(sb);
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

观察到输出的结果是:

构造器
{name=优快云,sex=男,age=11,test1=优快云,test2=null,}

发现变量修饰符为transient的变量没有被读取到,当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。



深入解析Linux Suspend/Resume机制——从用户态到内核态的完整流程 本文深入解析Linux Suspend/Resume机制,从用户态触发到内核态执行的完整流程。详细介绍了三种挂起模式(Freeze、Standby、Suspend to RAM)的实现原理,包括系统调用入口、状态验证、设备挂起流程及平台相关操作。同时提供实战调试技巧,帮助开发者解决电源管理中的常见问题。 阅读详情

相关推荐

Unity 接入HybridCLR的点点滴滴,亲测三平台(PC、Android、WebGL)妥妥的。-问题分享

一入热更深似海啊,没有热更是真恼火啊,干啥啥不方便,动不动就得重新发包;说实在的,也是工作之余研究这个,在原有框架基础上接入这个热更,既要保持原有功能,还要支持热更,实实在在、断断续续搞了这么久,终于是接入并测通了,这一路是坎坎坷坷,下面把走过的弯弯绕绕记录下,希望对后来想接入的小伙伴有帮助吧。

GarFe的博客 1万+

Java 序列化与反序列化

Java 序列化Java可以将一个对象表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。 将序列化对象写入文件以后,可以从文件读取出来,并且对它进行反序列化。 在java的序列化和反序列化的过程中,整个过程都是Java 虚拟机(JVM)独立的,可以在一个平台序列化然后在另一个平台反序列化。public final void writeObject(Ob

Ytsssss的博客 297

UE4游戏开发:GameInstance与GameMode的实战应用与避坑指南

本文深入解析了UE4中GameInstance与GameMode的核心差异与实战应用。GameInstance作为贯穿游戏进程的全局单例,负责跨关卡数据持久化与系统管理;而GameMode则定义特定关卡内的游戏规则与逻辑,随关卡加载销毁。文章通过数据存储、动态模式切换及网络游戏等场景,提供了清晰的应用指南与常见避坑方案,帮助开发者构建更健壮的UE4游戏架构。

kubernetes8ctl的博客 230

java中的序列化机制详解

对象的序列化机制  要想一个对象可以持久化到一个文件当中,必须保证这个对象所处的类是可序列化的。这个持久化的过程就叫做序列化。同理反序列化也需要保证这个对象所处的类是可序列化的。  当然不仅可以存在持久化到文件,也可以通过网络的方式传输出去。 对象的序列化机制:  允许把内存中的Java对象转换成与平台无关的二进制流,从而允许把这种二进制流持久的保存在硬盘上,或者通过网络将这种二进制流传输到另一个网络节点。—>(序列化)  当其他程序获得了这种二进制流,就可以恢复成原来的Java对象。—>(反序

zrulin的博客 997

SAP PP后台配置实战:从BOM到工艺路线的全流程解析

本文详细解析了SAP PP模块后台配置的全流程,从BOM到工艺路线的关键步骤与实战技巧。通过分享生产计划、工作中心能力计划等核心配置经验,帮助企业优化生产管理流程,提升SAP系统实施效率。特别针对BOM配置、工艺路线设置等常见问题提供解决方案。

weixin_29300931的博客 1010

DSP28335量产升级避坑指南:C2Prog串口烧录.hex文件,为什么我推荐COM1?

本文详细解析了DSP28335量产升级中C2Prog串口烧录.hex文件的最佳实践,重点推荐使用COM1端口以确保稳定性。通过实测数据和底层机制分析,揭示了Windows系统对COM1的特殊优化及C2Prog工具的时钟切换逻辑,帮助开发者规避常见陷阱,提升烧录成功率。

weixin_27066963的博客 384

java的序列化机制是通过_通过实例了解java序列化机制

这篇文章主要介绍了通过实例了解java序列化机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下序列化是指对象通过写出描述自己状态的数值来记录自己的过程,即将对象表示成一系列有序字节,Java提供了将对象写入流和从流中恢复对象的方法。对象能包含其它的对象,而其它的对象又可以包含另外的对象。Java序列化能够自动的处理嵌套的对象。对于一个对象的简单域...

weixin_42513038的博客 181

卡尔曼滤波调参避坑指南:Q/R参数怎么设?实测5种传感器场景

本文针对卡尔曼滤波在工程实践中Q/R参数设置的难题,提供了一套实用的调参避坑指南。通过分析过程噪声方差Q与测量噪声方差R的物理意义与博弈关系,并结合温度传感器、陀螺仪、超声波测距等五种典型传感器场景的实测效果对比,总结出从噪声估算、离线仿真到收敛测试的系统性调参方法论,帮助工程师快速实现稳定有效的滤波效果。

weixin_29174141的博客 803

序列化和反序列化的底层实现原理是什么

序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一个问题,自信满满的说了一大堆,什么是序列化、什么是反序列化、什么场景的时候才会用到等,然后面试官说:那你能说一下序列化和反序列化底层是如何实现的吗?一脸懵逼,然后回家等通知!一、基本概念...

T_Janey 3955

YOLOv8 | 损失函数改进,最新提出的Shape-IoU,有效涨点

作为检测器定位分支的重要组成,边框回归损失在目标检测任务中发挥巨大作用。现有的边框回归方法,通常考虑了GT框与预测框之间的几何关系,通过使用边框间的相对位置与相对形状等计算损失,而忽略了边框其自身的形状与尺度等固有属性对边框回归的影响。为了弥补现有研究的不足,本文提出聚焦边框自身形状与尺度的边框回归方法。首先我们对边框回归特性进行分析,得出边框自身形状因素与尺度因素会对回归结果产生影响。

kay_545 1913

关于IBV_WR_RDMA_WRITE_WITH_IMM的理解

对于IBV_WC_RECV_RDMA_WITH_IMM的描述是这样的,也就是说并不需要sge,所以下发的sge,可以是NULL,个数可以是0。(1)需要下发post_recv,但是下发是post_recv当中的sge的地址可以是空,sge个数可以是0。伪代码,实际的rkey和addr已经通过socket交换。并且poll_cq时,有返回,在这篇文章当中对于poll_cq时,主要区别点有两个,这个是对于接收端而言。(2)可以带即时数据,

qq_38158479的博客 2418

序列化和反序列化以及创建对象的几种方式

    如何将对象中的信息永久保存           1.将来将对象信息存入数据库           2.java 中提供的序列化方式来永久保存数据 序列化流的概述            所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要重写Serializable 接口才能被序列化 package org.westos.Demo; import java.io.*; ...

qq_41942241的博客 6987

【算能】TPU 指令集架构深度解析

TPU指令集以领域专用性与数据流驱动为核心,通过精简指令集、硬件固化逻辑与高并行架构,实现张量计算的极致性能。开发者通常无需直接编写指令,但理解其设计原理对性能调优(如内存布局优化、指令调度)至关重要。算能TPU通过开放指令描述与编译器工具链,为垂直行业提供了更高灵活性的定制空间,而谷歌TPU则依赖编译器的全自动化优化,更适合大规模标准模型部署。未来,随着稀疏计算、光子计算等技术的引入,TPU指令集将进一步向高能效与高泛化性演进。

浩瀚之水的专栏 1182

java序列化机制(一)

序列化的目的Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。一般用于将对象保存在磁盘中或者跨进程通信(网络通信)。序列化APIjava.io.ObjectOutputStream和ObjectInputStream用于对象I/O。要被序列化的对象必须实现Serializable或者Externali

博客已搬家,请访问新博客https://kswapd.cn,提供更好的阅读体验。 585

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java序列化与static

今天我们介绍Java序列化,以及Java序列化和static变量的关系,阐述为什么Java不能序列化static变量,并附予实例讲解。

VV 7293

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java对象的序列化和反序列化

要序列化的了类需要实现Serializable接口 package com.mouday; import java.io.Serializable; public class Person implements Serializable { // 序列化前后的唯一标识符 private static final long serialVersionUID = 1; private String name; private int age; private int

彭世瑜的博客 1140

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java中类序列化构造函数的调用问题

public class Person implements Serializable{ public Person(){ System.out.println("Person..."); } } public class Student extends Person{ public Student(){ System.out.println("Student..."); } }

星星之火的专栏 2850

Java序列化机制要序列化那些内容

在javaeye上搜到一篇robbin关于java序列化的回复,我觉得其中的例子很有说服力,转过来和大家分享。 关于更多java序列化的问题可以参见JAVA系列之对象的序列化与反序列化 Java的序列化机制只序列化对象的属性值,而不会去序列化什么所谓的方法。其实这个问题简单思考一下就可以搞清楚,方法是不带状态的,就是一些指令,指令是不需要序列化的,只要你的JV...

{丸の子} 110

Java中的序列化和反序列化

关于序列化和反序列化的简单理解。

weixin_73986007的博客 742

Java 基础 对象的序列化流ObjectOutputStream

package demo7; import java.io.Serializable; /* * 序列化和反序列化的时候,会抛出NotSerializableException没有序列化异常 * 类通过实现:java.io.Serializable 接口以启动其序列化功能,未实现接口的类将无法使其任何状态序列化或反序列化 * Serialiable接口也叫标记型接口 * 要进行序列化和反...

毛毛虫会长大 262

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.3 修改默认的序列化机制...

2.4.3 修改默认的序列化机制 某些数据域是不可以序列化的,例如,只对本地方法有意义的存储文件句柄或窗口句柄的整数值,这种信息在稍后重新加载对象或将其传送到其他机器上时都是没有用处的。事实上,这种域的值如果不恰当,还会引起本地方法崩溃。Java拥有一种很简单的机制来防止这种域被序列化,那就是将它们标记成是transient的。如果这些域属于不可序列化的...

weixin_34043301的博客 134

Java序列化

什么是序列化 简单来说序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O)。我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的! 问题的引出 如上所述,读写对象会有什么问题呢?比如:我要...

dianjinhui5856的博客 108

java基础----IO序列化Serializable

package com.henu.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /* * java.io.Ob...

乔治大哥的博客 499

java的重写序列化

       这几天在看java序列化的一些东西,资料上说写了在序列化类(比如LinkedList,ArrayList,HashMap等容器类)里面加上wirteObject(ObjectOutputStream stream),readObject(ObjectInputStream stream),序列化和反序列化的时候会分别调用上面两个方法,而不走默认的序列化流程。但是一直想不通在什么时候调...

心里打结,为了过得舒服点,只好拼命的开结 806

java 默认序列化_防止Java序列化设置默认值

序列化并未设置默认值,而是将其默认值设置为Java的默认值初始化方案。如果我可以总结你的问题。您希望序列化将序列化流中的内容与内存中的值合并。对于Java序列化来说这是不可能的,因为它控制着要创建的对象。您可以读取序列化对象,然后手动编写代码以合并要合并的字段。如果你坚持使用Java序列化(如果我是你,我会避开它),但是让我们假设你想继续使用它。public class MyObject {pub...

weixin_34138102的博客 1099
上一篇: 通过JIntellitype给Java程序注册系统热键
下一篇: 利用tomcat插件实现自动部署
weiythi
博客等级 码龄16年 23粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值