认识一下Java序列化

说明:本文只是简单介绍Java的序列化,大牛们可以绕道而行~

概述:

  1. 序列化是什么?
    就是将一个Java对象“流”化(转换成二进制数据流),流化后就能将对象保存到某种介质(磁盘、数据库等)或在某种介质(网络)上传送。
    简单的说就是  对象 --> 二进制数据,计算机就是处理二进制数据的专家,所以无论你存储,传输还是做某些操作(例如:加密、转换)都是可行的。
  2. 序列化和反序列化
    序列化:对象 --> 二进制数据流
    反序列化:二进制数据流 --> 对象
    这个过程让我想到的超时空传送:从一个地方把你打成分子并记录结构,然后通过某种高科技的东西进行传送,然后在目的地把你再按照记录组装出来。
  3. 实现序列化的方式
    1.打上标记接口Serializable
    2.实现Externalizable接口并实现里面的相关方法
  4. 两种方式的比较
    1.上手度:Serializable比较容易,直接继承接口即可。
    2.性能上:Externalizable要略好于Serializable。
    3.选择:往往我们选择Serializable,因为他简单。
  5. 我们看个例子,感官认识一下 请看演示一
    1.我们定义一个Book类,让其打上标记接口Serializable,OK我们的序列化已经完成一多半了。
    2.序列化:我们用ObjectOutputStream去写一个Book对象到我们的介质中(这里是一个data文件)
    3.反序列化:我们用ObjectInputStream去将介质中的流读出来并转换成Book的对象。
    4.这里注意 当反序列化的时候 必须提供对应类的class文件,他就像设计图 告知程序将流转成什么样子的对象。
    5.序列化就是这么简单~
  6. 其实不然,序列化不仅仅只有这么简单
    1.序列化的对象中还有其他对象!那序列化的时候必须需要这个其他对象也能序列化。见 Author定义
    2.Java序列化机制只会序列化一次相同的Java对象。见 演示二
    3.被static和transient修饰的field,不进行序列化。没有演示...
       1.static代表的是类状态。
       2.transient是瞬态(可以理解为临时数据)。
    4.自定义序列化:自己实现一个类似编码器和解码器的东西。 没有演示...
    5.Externalizable:需要自己实现序列化和反序列化的 序列化方式 没有演示...
    6.序列化版本:见Book类的serialVersionUID
       1.为了保证类变化后的兼容性
       2.保证移植性
  7. 本文只是简单的介绍了序列化 并列举了一些的关注点,有兴趣的朋友可以深入研究。

package com.cxyapi.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/** 认识一下Java序列化
 * @author cxy @ www.cxyapi.com
 */
public class SerializableTest
{
	public static void main(String[] args) throws Exception
	{
		//演示一:最简单的序列化例子
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:/cxyapi.data"));
		Book b1=new Book("Java教程");
		oos.writeObject(b1);
		oos.close();
		
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/cxyapi.data"));
		Book b2=(Book)ois.readObject();
		System.out.println(b2.getName());
		ois.close();
		System.out.println("=====================");
		
		//演示二:一个包含其他对象的对象
		oos=new ObjectOutputStream(new FileOutputStream("d:/cxyapi.data"));
		Author a=new Author("cxy");
		//点1:两本书我存同一个对象(作者)
		BookExt be=new BookExt("cxyapi", a);
		BookExt be1=new BookExt("snkcxy.iteye.com", a);
		oos.writeObject(be);
		//点2:我存2遍be1
		oos.writeObject(be1);
		oos.writeObject(be1);
		oos.close();
		
		ois=new ObjectInputStream(new FileInputStream("d:/cxyapi.data"));
		//存3个对象 我取3个对象,多取会报错
		BookExt bec=(BookExt)ois.readObject();
		BookExt be1c=(BookExt)ois.readObject();
		BookExt be1cc=(BookExt)ois.readObject();
		System.out.println(bec.getName());
		System.out.println(be1c.getName());
		System.out.println(be1cc.getName());
		//判断最后2个对象 其实是一个对象,这是Java序列化机制所知,它不会一下序列化出很多同样的对象
		System.out.println(be1c==be1cc);
		System.out.println(be1c.hashCode());
		System.out.println(be1cc.hashCode());
		//判断作者,其实也是同一个对象
		System.out.println(bec.getAuthor()==be1c.getAuthor());
		System.out.println(bec.getAuthor().hashCode());
		System.out.println(be1c.getAuthor().hashCode());
		ois.close();
		System.out.println("=====================");
	}
}

class Book implements  Serializable
{
	private static final long serialVersionUID = -564380176443249810L;
	private String name;
	
	public Book(String name)
	{
		this.name=name;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}
}


/** 扩展书类,实现序列化 并且里面加入了作者信息
 * @author cxy @ www.cxyapi.com
 * 2013-3-12 下午11:18:22
 */
class BookExt implements  Serializable
{
	
	private String name;
	
	private Author author;
	
	public BookExt(String name,Author author)
	{
		this.name=name;
		this.author=author;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public Author getAuthor()
	{
		return author;
	}

	public void setAuthor(Author author)
	{
		this.author = author;
	}
}

/** 必须能序列化 不然 BookExt也将不能序列化
 * @author cxy @ www.cxyapi.com
 * 2013-3-12 下午11:42:40
 */
class Author implements  Serializable
{
	private String name;
	
	public Author(String name)
	{
		this.name=name;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}
}

 

声明:

1.原创文章,转载请标明并加本文连接。

2.文章反映个人愚见,如有异议欢迎讨论指正

3.更多的内容请看我的  个人博客(测试版)

【java】java序列化、ArrayList序列化、序列化策略 1、如果一个类想被序列化,需要实现Serializable接口。否则将抛出异常,这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种。2、在变量声明前加上该关键字,可以阻止该变量被序列化到文件中。3、在类中增加writeObject 和 readObject 方法可以实现自定义序列化策略。 阅读详情

相关推荐

JDK12(JavaSEDevelopmentKit)12.0官方中文正式版Win64位

JDK12全称Java SE Development Kit 12目前已经正式发布了,新的Java JDK 12正式版中存在两套 64 位 ARM 实现,主要存在于 src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目录。两者都实现了 aarch64,现在将只保留后者,删除由 Oracle 提供的 arm64。这将使贡献者将他们的精力集中在单个

JavaSE 12

方法的重写(override / overwrite) 1.重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作 2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。 3. 重写的规定: 方法的声明: 权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{ //方法体 } 约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法 ① 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同 ②

cystart的博客 224

il2cpp分析-gobal-metadata.dat解密

打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat。ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数。VSCode打开il2cpp源代码,全局搜索global-metadata.dat。工具:010Editor,IDA 7.5,Jadx,VS Code。判断加密逻辑为根据文件的长度循环读取字节码做亦或加密。双击搜索出来的结果,切记要选il2cpp目录下的。

Android_machong的博客 8022

12-基本输入与输出

Java基本输入与输出

titanium的博客 542

STM32H743实战(三)-- 时钟系统配置

本文详细讲解了STM32H743时钟系统的配置方法,重点解析了为何选择400MHz而非理论极限480MHz作为稳定运行的主频。通过STM32CubeIDE环境,手把手指导如何从外部晶振配置、电源电压设置到PLL锁相环参数调整,最终实现稳定可靠的400MHz系统时钟,并提供了代码验证与常见问题排查指南。

weixin_29164185的博客 367

GAN管CGH40010F设计宽带Doherty功放:如何用ADS搞定输入匹配、合路网络与功分器?

本文详细介绍了基于CGH40010F GaN晶体管的宽带Doherty功放设计流程,重点讲解在ADS平台中实现输入匹配网络、合路网络与功分器的关键技术。通过寄生参数补偿、渐变微带线设计和复合补偿结构等方法,解决了宽带化设计中的核心挑战,最终实现1.7-2.6GHz频段内72%的峰值效率和52%的回退效率。

weixin_42614269的博客 472

JavaSE十二(Set)

文章目录Set3.1 Set集合的概述和特点3.2 哈希值3.3 HashSet集合的概述和特点3.4 HashSet集合保证元素唯一性源码分析3.5 常见数据结构之哈希表案例:HashSet集合存储学生对象并遍历3.6 LinkedHashSet集合概述和特点3.7 TreeSet集合概述和特点3.8 自然排序Comparator的使用3.9 比较器Comparator排序的使用案例:成绩排序案例:不重复的随机数 Set 3.1 Set集合的概述和特点 Set集合的特点 不包含重复元素的集合 没有带索引

qq_46002941的博客 1737

OpenClaw用户必看:每天0成本使用OpenClaw!NVIDIA NIM免费大模型接入教程

🚀 OpenClaw接入NVIDIA NIM免费API!glm5、minimax-m2.5等大量模型任选,0成本升级AI助手!💰

XiaoqiangClub的博客 5572

JavaSE 12 规范草案

JSR 386 – JavaSE 12 规范草案 吐槽 自从 Java 9 开始,JCP 开始了6个月一个大版本的更新… 作为一名 Java 工程师,我心里简直 ---- 喵喵喵(此处含有屏蔽字段) 上个月正式发布了 Java 11, 并开始进行日常 18 个月的安全以及补充更新维护,并提出了 Java 12 的早期版本的规范草案,也就是差不多 6 个月后,Java 12 就发布了… 并且代码实现...

一步一个脚印 1801

【实战篇】【硅基流动API+Cherry Studio搭建个人知识库全流程解析:从零到精通的超详细指南】

在人工智能技术高速发展的今天,基于大语言模型的知识库已成为开发者提效的必备工具。然而云端服务存在响应延迟、数据隐私、硬件依赖等痛点。通过硅基流动API与的深度整合,我们既能享受大模型的强大能力,又能实现本地化部署与高效管理。本文将从环境配置到高阶调优,手把手带你构建企业级知识库系统。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1080

Android性能分析——hprof文件分析(一)

hprof  文件是 Java 堆转储文件(Heap Dump File)的标准格式,用于保存 Java 虚拟机(JVM)在某个时间点的内存快照。这种文件对于分析内存泄漏、内存使用情况和对象分配模式非常有用。

小旭的专栏 1876

再来认识一下 Java 序列化

前言 在面试中,Java 序列化被问到的几率还是挺高的。所以搜集了 Java 序列化常见的问题,由浅入深的帮助大家进一步学习和理解。 序列化基础知识 什么是序列化? Java 序列化是 JDK 1.1 中引入的特性之一。 总的来说,序列化讲一个 Java 对象所描述的所有内容以文件 IO 的方式 存储 或 传输 的过程。核心作用是对象状态的保存和重建。 在这里有两个比较重要的概念: 序列化:把 Java 对象转换为字节码的过程 反序列化:把字节码还原为 Java 对象的过程 为什么要序

weixin_45790183的博客 262

作为专家系统与应用的审稿人:提醒你投稿注意事项

本文为《专家系统与应用》(ESWA)期刊投稿指南,重点强调研究方向匹配性、学术质量和写作规范。要求论文以智能系统/算法为核心,突出增量创新并具可验证性,需包含严谨方法论和充分实验验证。写作需结构清晰,符合期刊格式要求,包括明确的研究问题、分类文献综述、详细技术实现和量化结果。投稿前需仔细核对期刊指南,引用相关文献,并妥善处理审稿意见。ESWA注重创新实质性和应用落地价值,建议突出智能系统设计核心,避免成为单纯技术应用描述。

ZhangJiqun&191cm&85kg 1785

java返回的类不能被序列化,再来认识一下 Java 序列化

前言在面试中,Java 序列化被问到的几率还是挺高的。所以搜集了 Java 序列化常见的问题,由浅入深的帮助大家进一步学习和理解。序列化基础知识什么是序列化?Java 序列化是 JDK 1.1 中引入的特性之一。总的来说,序列化讲一个 Java 对象所描述的所有内容以文件 IO 的方式 存储 或 传输 的过程。核心作用是对象状态的保存和重建。在这里有两个比较重要的概念:序列化:把 Java 对象转...

weixin_39796839的博客 820

Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册

前言 相比与Xilinx和Altera在国内的市场,Microsemi的FPGA在国内应用很少很少,网上几乎没有详细的教程,刚开始使用时,遇到了各种问题,自己也走了不少弯路。本系列教程以Libero V11.8.2.4,SmartFusion系列A2F200M3F FPGA芯片为例,将详细介绍Libero SoC软件的基本使用,及使用过程中遇到一些问题的解决方法。 Libero 简介 关于Lib...

whik1194的博客 3万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

序列化的高阶认识-简单认识一下 Java 原生序列化

前面的代码中演示了,如何通过JDK提供了Java对象的序列化方式实现对象序列化传输,主要通过输出流java.io.ObjectOutputStream和对象输入流java.io.ObjectInputStream来实现。 java.io.ObjectOutputStream:表示对象输出流,它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 java.io.ObjectInputStream:表示对象输入流,它的re...

Leon_Jinhai_Sun的博客 122

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JAVA的序列化

Java序列化其实这个用的多不多,我觉得看公司的技术栈吧,如果用的是cloud那套,估计接触的会少点,但是也不是说没有,如果是dubbo那套的话,就多点,上次我们说Netty的编码解码的时候说到了谷歌的protoBuf,今天的话我们就来好好看看Java序列化,详细的聊聊从上面这张图我们可以看到,两个进程进行通信时候,想要发送数据,要先要把数据发送到TCP缓冲区,然后形成报文再发送出去,同样的道理,接收端也是一样。我们可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式

m0_71563599的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java中的序列化及序列化ID

参考转载自: 秒懂Java序列化与反序列化 Java的序列化ID的作用 1. 定义 Java的序列化:是指把Java对象转换为字节序列的过程 Java的反序列化:是指把字节序列恢复为Java对象的过程 2. 为什么需要 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要Java序列化与反序列化了。换句话说,一方面,.

三明治文鱼的博客 5841

JAVA序列化

对象序列化(object serialization)是java支持的通用机制,可以将任何对象写出到流中,并在之后将其回读。简单来说,就是可以将对象数据保存为文件,甚至可以通过网络传输,在这之后或者别的主机上恢复当前保存的数据状态。

weixin_44145526的博客 1494

【Java杂记】序列化:从Java序列化到多种序列化方式

1.序列化是什么 Java平台允许我们创建对象 但是只有当JVM运行时,这些对象才存在,也就是说对象的声明周期不回避JVM的生命周期长 但我们在硬盘上存储对象,或者通过网络传输对象的时候已经脱离了JVM,已经不是java对象了 ==> 需要一种方式:Java对象 —序列化–> 保存/传输 –反序列化–> Java对象 序列化(编码): 把对象的状态信息转化为可存储或传输的形式过程,也就是把对象转化为字节序列的过程 Java对象 –编码协议–> 字节/符序列 反序列化(解码

A minor 3010

Java 序列化详解

如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。序列化:将数据结构或对象转换成可以存储或传输的形式,通常是二进制字节流,也可以是 JSON, XML 等文本格式反序列化:将在序列化过程中所生成的数据转换为原始数据结构或者对象的过程。

hezhixiang202100的博客 1112

【Java】Java序列化和反序列化

为了序列化对象,我们调用ObjectOutputStream类的writeObject()方法,而为了反序列化,则调用ObjectInputStream类的readObject()方法。SerializeISA类已序列化扩展了Person类的Student类对象,而Person类是可序列化的。序列化和反序列化过程是平台无关的,这意味着您可以在一个平台上对对象进行序列化,在另一个平台上进行反序列化。现在,id将不会序列化,因此在序列化之后反序列化对象时,您将不会得到id的值。它是序列化的逆操作。

double222222的博客 1141

从Java序列化到Hadoop序列化

一个原生的类讲解一下,自定义比较器讲解一下,内部类讲解一下。WritableComparator是 WritableComparables的比较器。这个基础实现类使用是自然的排序规则,如果要使用其他的排序规则,需要重写compare(WritableComparable,WritableComparable)方法。

Jenny19992018的博客 590

Java 序列化

如果我们需要持久化Java对象比如说将Java对象保存在文件中,或者在网络传输Java对象,这些场景都需要序列化。简单来说序列化:将数据结构或者对象转换成可以存储或传输的形式,通常是二进制字节流,也可以是JSON,XML等文本格式反序列化:将在序列化过程中所生成的数据转换为原始数据结构或者对象的过程。

rc1596919047的博客 986

Java序列化与反序列化

*序列化(Serialization)**是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,序列化是将对象转换为字节序列的过程。**反序列化(Deserialization)**是将序列化的字节序列恢复为对象的过程。序列化:对象 → 字节流反序列化:字节流 → 对象通过实现和readObject// 不序列化密码// 自定义序列化// 调用默认序列化// 对密码进行加密后再序列化// 自定义反序列化// 调用默认反序列化// 解密密码。

weixin_74417835的博客 1378

java中序列化与反序列化

一、基本概念 1、序列化和反序列化的定义: (1)Java序列化就是指把Java对象转换为字节序列的过程 Java反序列化就是指把字节序列恢复为Java对象的过程。 (2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。 反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。 总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息) 2、j

weixin_43167662的博客 2035
上一篇: Java变量类型识别的3种方式
下一篇: Java入门 之 static
snkcxy
博客等级 码龄19年 0粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值