java序列化的方法_【Java常见序列化与反序列方法总结】

人和电脑在很多方面都是十分相似的,大脑可以看成电脑主机,五官/身体等表面器官就是显示器、鼠标等外设。这篇文章就是想把计算机跟人做类比YY一下序列化和反序列化的机制、用途。

如果你是初学者,心里肯定会问究竟什么是序列化/反序列化?其实我现在正在雨林木风xp系统下载序列化而你正在反序列化:我在写这篇博客的时候就是把大脑中的想法和思想经过梳理写成连续的文字,这就是序列化,而你在读这篇博客的时候把这些整理过的文字读进大脑形成你自己的思想,这个过程就是反序列化。 我们可以把大脑中的想法通过文字或声音传递,这样有“共同语言”的人就能将这些文字,声音"读"进大脑形成自己的思想,这就是 人与人之间“沟通、交流”的过程;为了防止记忆丢失我们通常会把自己的一些想法、知识以文字形式或声音进行“保存”。  计算机中序列化的定义是:把对象转换成数据流以便在网络上进行传输,或者将对象持久的存储在某个地方的过程;相反,反序列化是接收数据流转换成对应的对象或从持久化存储读取数据转换成对象的过程。简单来说序列化就是用来做"有意义"的存储或通信的。在Java中我们可以把一个对象序列化到网络流,文件流,也可以序列化到字节数组等,然后可以从网络流、文件流和字节数组等反序列化生成相应的对象。

上面已经提到序列化、反序列化主要用于对象的持久化存储和远程通信。尤其在分布式系统中,应用十分广泛。

下面对Java默认实现的序列化机制做一个由浅入深的介绍。

a.首先是序列化机制的目标,下面是官方说明:

1.简单且易于扩展;

2.序列化形式能够保证Java对象类型信息和安全属性信息不丢失;

3.方便扩展支持marshalling和unmarshalling,这是实现远程对象的基础;

4.易于扩展,能方便实现Java对象的持久化;

5.针对不同类的对象提供可定制的持久化方式;

6.允许对象定制自己的外部表示形式;

b. java默认提供的序列化机制:

1.序列化的基本步骤:

FileOutputStream fos = new FileOutputStream(outputFile)

1:ObjectOutputStream oos = new ObjectOutputStream(fos);

2:oos.writeObject(object);

3:oos.close();

第一步是创建一个对象输出流oos,可以把对象序列化到文件、字节数组等,在构造oos时赋予不同类型的流参数即可。

在ObjectOutputStream的JDK实现中可以看出,构造oos对象时有安全管理器的校验、设置流格式(包括设置流的头信息:两个MagicNumber)。

第二步就是写入需要序列化的对象,这一步也是最为复杂的,包含了序列化机制的细节信息。

第三步关闭流。

第一步创建对象输出流的时候,其实会初始化两个Table:HandleTable和ReplaceTable,HandleTable主要是为了防止相同对象数据的重复写入而设计。其中保存了原始对象到标志此对象index的映射,这样碰到重复的对象时写入的实际上是这个index而非原始对象数据。还可以对原始序列化对象进行替换,ReplaceTable用来保存被替换对象的信息。

序列化机制里面有很多细节值得去挖掘:

比如:1.Java中的引用到底是什么,而序列化对象的时候如何消除重复对象的保存。

2.对于cycle reference的情况又是如何处理的。

后面将做更加详细的分析。

很多商业项目用到数据库、内存映射文件和普通文件来完成项目中的序列化处理的需求,但是这些方法很少会依靠于Java序列化。本文也不是用来解释序列化的,而是一起来看看面试中有关序列化的问题,这些问题你很有可能不了解。“Java序列化指的是将对象转换程字节格式并将对象状态保存在文件中,通常是.ser扩展名的文件。然后可以通过.ser文件重新创建Java对象,这个过程为返序列化”

Java序列化的API中提供了开发人员进行序列化对象的机制,通过Serializable和Externalizable接口。

一起看看这些问题:

1)Java中的Serializable接口和Externalizable接口有什么区别?

这个是面试中关于Java序列化问的最多的问题。我的回答是,Externalizable接口提供了两个方法writeExternal()和readExternal()。这两个方法给我们提供了灵活处理Java序列化的方法,通过实现这个接口中的两个方法进行对象序列化可以替代Java中默认的序列化方法。正确的实现Externalizable接口可以大幅度的提高应用程序的性能。

2)Serializable接口中有借个方法?如果没有方法的话,那么这么设计Serializable接口的目的是什么?

Serializable接口在java.lang包中,是Java序列化机制的核心组成部分。它里面没有包含任何方法,我们称这样的接口为标识接口。如果你的类实现了Serializable接口,这意味着你的类被打上了“可以进行序列化”的标签,并且也给了编译器指示,可以使用序列化机制对这个对象进行序列化处理。

3)什么是serialVersionUID?如果你没有定义serialVersionUID意味着什么?

SerialVersionUID应该是你的类中的一个public static final类型的常量,如果你的类中没有定义的话,那么编译器将抛出警告。如果你的类中没有制定serialVersionUID,那么Java编译器会根据类的成员变量和一定的算法生成用来表达对象的serialVersionUID ,通常是用来表示类的哈希值(hash code)。结论是,如果你的类没有实现SerialVersionUID,那么如果你的类中如果加入或者改变成员变量,那么已经序列化的对象将无法反序列化。这是以为,类的成员变量的改变意味这编译器生成的SerialVersionUID的值不同。Java序列化过程是通过正确SerialVersionUID来对已经序列化的对象进行状态恢复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的编码模块char_关于sqlmap当中tamper脚本编码绕过原理的一些总结(学习python没多久有些地方肯定理解有些小问题)...

sqlmap中tamper脚本分析编写置十对一些编码实现的脚本,很多sqlmap里面需要引用的无法实现,所以有一部分例如keywords就只写写了几个引用了一下,其实这里很多脚本运用是可以绕过安全狗的。本人也是刚开始学习python没多久,有一些错…

java的多态怎么理解_JAVA多态的理解

面向对象的三大特性:封装、继承、多态,其中最难理解的就是多态以下是网上某大神给的一个例子:1.继承关系class A {public String show(D obj){return ("A and D");}public String show(A obj){return ("A and A");}}clas…

java class isassignablefrom_Java之——Class的isAssignableFrom方法

转载请注明出处 https://blog.csdn.net/l1028386804/article/details/80508540Class的isAssignableFrom方法定义如下public native boolean isAssignableFrom(Class ? cls);由方法签名可见是一个本地方法 即C代码编写的。以下是JDK中的注释Determines if the class or interfa…

java中堆栈的基本操作_玩儿转队列和栈的基本操作及其应用:Java 版

队列的基本操作队列入队出队实现队列是种先进先出的数据结构。队列的基本操作主要是入队和出队。数据从队尾进入队列,从队首出队列。下面来写一个简单的队列:public class MyQueue {private List data;private int pointer;public MyQueue() {data new ArrayList&l…

java规定日期格式输出_Java格式化输出日期百分比时间等

Java格式化输出Java的格式化输出等同于String.Format,与C有很大的相似,比如System.out.printf(“%8.2f”, x);在printf中,可以使用多个参数,例如:System.out.printf(“Hello, %s. Next year, you’ll be %d”, name, a…

java界面编辑教程_java程序设计基础教程第六章图形用户界面编辑.docx

java程序设计基础教程第六章图形用户界面编辑.docx还剩27页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,很抱歉,此页已超出免费预览范围啦!如果喜欢就下载吧,价低环保!内容要点…

c盘java文件误删_java获取C盘下的隐藏目录文件名称

题记—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。网易云课堂在Java中, File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传…

对java这门课程的认识_关于java课程的总结

前言本次博客主要内容为此次三次作业的总结,整门java课程学习的总结,以及在此次java课程中的收获,和对课程的意见。作业过程总结第一次作业主要考察的是对程序的可扩展性,实现开闭原则非常重要,因为程序随着时间&#…

linux php和java环境变量配置_Linux下配置Java环境变量

一般来说,我们都会把Java安装到 /usr/local 目录 或者 /opt 目录下。这里假设java安装包已解压在了 /opt下,具体目录为:/opt/java8/java1.8.0_45目录(注意:如果是生产环境中,一定要root用户来安装配置)。下面我们来配置…

java多线程多态_Java学习之多线程

多线程:(一)进程与线程进程特点并发与并行的区别:多线程编程的好处:(二)多线程的建立1,通过继承Thread类,代码如下:class MyThread extendsThread {private static int K 10;//类共享变量private int M10;…

java 执行存储过程报语法错误_为什么我在批处理从Java上执行PostgreSQL上的存储过程时收到错误通知“结果不合理”?...

我在数据库中有这个过程:CREATE OR REPLACE FUNCTION replacePageRelevance(id INT, value REAL) RETURNS VOID AS $$BEGININSERT INTO pageRelevance VALUES (id,value);EXCEPTION WHEN unique_violation THENUPDATE pageRelevance SET relevance value WHERE pag…

python staticmethod有什么意义_关于静态方法:python中的@staticmethod有什么意义?

为了更好地理解静态方法在Python中的工作方式,我开发了这个简短的测试/示例代码。class TestClass:def __init__(self, size):self.size sizedef instance(self):print("regular instance method - with self")staticmethoddef static():print("sta…

java fx border_JavaFx UI控件与代码间的绑定方法

JavaFx初探一,UI控件的使用,具体内容如下方式一:使用纯代码直接new view控件,这样就不涉及到与fxml文件之间的交互了方式二:使用fxml编写界面文件,用可视化工具scene builder 来构建交互界面。分两种方式绑…

java mysql ssl警告_连接到MySQL数据库时有关SSL连接的警告

用于初始化与MySQL服务器的连接的默认值在最近已更改,并且(通过快速查看堆栈溢出时最流行的问题和答案)新值引起了很多混乱。更糟糕的是,标准建议似乎是完全禁用SSL,这在制造过程中有点麻烦。现在,如果您的连接确实没有暴露给网络…

如何将php改成mp4,PHP 将视频转成 MP4 并获取视频预览图(用到ffmpeg)

搜索热词下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家,也给大家做个参考。flv_convert_get_thumb(input.avi,output.jpg,output.ogm);// code provided and updated by steve of PHPsnaps ! thanks// accepts:// 1: the input v…

php无嵌套遍历多维数组,不递归怎么遍历多维数组(维数不定)

不递归如何遍历多维数组(维数不定)现有数组$tree array (array (ID > 1,PARENT > 0,NAME > 祖父,CHILD > array (array (ID > 3,PARENT > 1,NAME > 叔伯),array (ID > 4,PARENT > 1,NAME > 父亲,CHILD > array (array (ID > 5,PARENT >…

c 如何操作php,thinkphp的c方法使用示例

1.C方法的作用a. 加载设置用户的配置,保存在一个C函数内的静态变量$_config 中b. 读取用户的配置 (从$_congig 中读取)2. 需求分析:1.设置变量1.二维数组C(array(DB_PASSWORD>root,DB_USERNAME>root),DB);C(DB.USER_NAME,XIAOCHEN);2.一维数组C(USER_NAME,小陈…

php seaslog安装,浅谈win10下安装php seaslog扩展的方法

本篇文章给大家分享一下win10 php安装seaslog扩展的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。【推荐学习:《PHP视频教程》】一、检查系统环境情况使用phpinfo()检查系统环境情况,找到需要下载的配置…

php 图片 处理,php图片处理类

本篇文章主要介绍php图片处理类&#xff0c;感兴趣的朋友参考下&#xff0c;希望对大家有所帮助。示例代码如下&#xff1a;<?php /*已知问题&#xff1a;1.在图片缩放功能中&#xff0c;使用imagecreatetruecolor函数创建画布&#xff0c;并使用透明处理算法&#xff0c;但…

php里push的用法,php array_push函数怎么用?

php array_push函数用于向数组尾部插入一个或多个元素&#xff0c;其语法是array_push(array,value1,value2...)&#xff0c;参数array必需&#xff0c;指规定一个数组&#xff1b;value1必需&#xff0c;指规定要添加的值。php array_push函数怎么用&#xff1f;定义和用法arr…