java笔记之基础-持久化和序列化

Java对象持久化,序列化

介绍:

​ 持久化就是将内存中的数据保存起来,使之可以长期存在。在JAVA中,我们可以把JAVA对象直接保存在文件中,在需要使用的时候,直接从文件中读取,这也是对象持久化的一种方式:

java对象持久化保存的方法

​ 在实际java应用开发的过程中,经常会遇到需要持久保存java对象的情况,比如:用户信息、博客评论内容等等,本文针对java对象的持久化保存方法进行讨论,简述各个方法的优劣,供大家参考。

通常有三种可以选择的方法,如下:

①使用文件
将所需保存的对象内容或者数据内容以文件的形式进行存储,在使用时直接读取文件并且解析。

  • 优点 几乎能够保存任何形式的数据;实现简单。
  • 缺点 读写文件的效率比较低,不适用于数据量比较大的情况。
  • 应用场景 读写速率要求不高、数据量不大且数据格式没有严格限定的情况。
    推荐使用形式 将对象转换为json字符串进行存取,java有json格式数据的解析函数,十分方便。

②使用序列化与反序列化

在不使用数据库的情况下,比较方便的保存和加载少量的数据。数据以XXX.ser文件保存。注意:XXX.ser 文件所在的路径必须已经存在,否则会出现“找不到”或者“不存在”问题。XXX.ser 文件能够自动生成。

  • 优点 能够保存所有对象数据,并且对私有数据可控;实现简单;读写数据结构严谨,解析方便。
  • 缺点 不适用于数据量比较大的情况。
  • 应用场景 读写速率要求不高、数据量不大的情况。

③使用数据库

根据数据具体类型,选择合适的关系型或者非关系型数据库。

  • 优点 适用于数据量比较大的情况;读写速度快;数据结构严谨。
  • 缺点 只能保存数据库接受的数据;比前两者实现稍显复杂。
  • 应用场景 读写速率要求高、数据量大且数据结构严谨的情况。
    推荐数据库 如果选用关系型数据库,数据量低于50GB的小型数据库应用, 推荐使用JDK自带的Apache Derby的内嵌开发模式。Derby非常小 巧,核心部分derby.jar只有2M,相比于使用其他数据库使用起来 十分简便。

java 序列化和反序列化的实现原理

介绍:

​ 老是听说序列化反序列化,就是不知道到底什么是序列化,什么是反序列化?

一、什么是序列化和反序列化?

①java序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程

序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存的java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。

反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。

④序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态

二、为什么需要序列化与反序列化

当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本,图片,音频,视频等,而这些数据都会以二进制的形式在网络上传送。

当两个java进行进行通信时,要传送对象,怎么传对象,通过序列化与反序列化。

也就是说,发送方需要把对象转换为字节序列,然后在网络上传送,另一方面,接收方需要从字节序列中恢复出java对象

三、序列化的好处

①永久性保存对象,保存对象的字节序列到本地文件或者数据库中,实现了数据的持久化,通过序列化可以把数据永久的保存到硬盘上,

②利用序列化实现远程通信,可以在网络上传送对象的字节序列。

③在进程间传递对象

四、序列化算法步骤

①把对象实例相关的类元数据输出

②递归输出类的超类描述直到不再有超类

③类元数据完了以后,开始从最懂曾的超类开始输出对象实例的实际数据值。

④从上至下递归输出实例的数据

五、Java 如何实现序列化和反序列化

① JDK类库中序列化API

java.io.ObjectOutputStream: 表示输出对象流

它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中;

②java.io.ObjectInputStream:表示对象输入流

它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回

③实现序列化的要求

只有实现了Serializable或Externalizable接口的对象才能被序列化,否则抛出异常!

④实现java对象序列化与反序列化的方法

六、JDK类库中序列化的步骤

①创建一个对象输出流,它可以包装一个奇特类型的目标输出流,如文件输出流:

objectOutputStream oos=new objectOutputStream(new FileOutStream(c:\object.out));

②通过对象输出流writeObject()方法写对象:

oos.writeObject(new a(“xiaoxiao”,“145263”,“female”));

七、JDK类库中反序列化的步骤

①创建一个对象输入流,它可以包装一个其他类型输入流,如文件输入流:

objectInputStream ois=new ObjectInputStream(new FileInputStream(“object.out”));

②通过对象输出流的readObject()方法读取对象:

a aa=(a)ois.readObject();

③为了正确读数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致

例 a 类,它的对象需要序列化,有3种方法

如果类a仅仅实现了Serializable接口,则

ObjectOutputStream采用默认的序列化方式,对a对象的非transient实例变量进行序列化

ObjectInputStream采用默认的反序列化方式,对a对象的非transient实例变量进行反序列化

如果类a仅仅实现了Serializable接口,并且还定义了a对象的writeObject(ObjectOutputStream out) 和readObject(ObjectInputStream in),则

ObjectOutputStream调用a对象的writeObject(ObjectOutputStream out)的方法进行序列化

ObjectInputStream调用a对象的readObject(ObjectInputStream in)的方法进行序列化

如果a类实现了ExternaInalizable接口,且User类必须实现readExternam(ObjectInput in)和wiriteExternal(ObjectOutput out)方法,则

ObjectOutputStream调用a对象的wiriteExternal(ObjectOutput out)的方法进行序列化

ObjectInputStream调用a对象的readExternam(ObjectInput in)的方法进行序列化‘’

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言都有相应的实现方式,可以应用于各种不同的场景。C语言的各种数据结构都有其优缺点,下面举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队: 优点:先进先出(FIFO)的特性使得
持久化splay是一种数据结构,它是对splay树进行修改和查询的一种扩展。在传统的splay树,对树的修改操作会破坏原有的树结构,而可持久化splay树则允许我们对树进行修改、查询,并且可以保存修改后的每个版本的树结构。 在可持久化splay树,我们不会直接对原树进行修改,而是通过复制每个节点来创建新的版本。这样,每个版本都可以独立地修改和查询,保留了原有版本的结构和状态。每个节点保存了其左子树和右子树的引用,使得可以在不破坏原有版本的情况下进行修改和查询。 为了实现可持久化splay树,我们可以使用一些技巧,比如引用提到的哨兵节点和假的父节点和孩子节点。这些技巧可以帮助我们处理根节点的旋转和其他操作。 此外,可持久化splay树还可以与其他数据结构相结合,比如引用提到的可持久化线段树。这种结合可以帮助我们解决更复杂的问题,比如区间修改和区间查询等。 对于可持久化splay树的学习过程,可以按照以下步骤进行: 1. 理解splay树的基本原理和操作,包括旋转、插入、删除和查找等。 2. 学习如何构建可持久化splay树,包括复制节点、更新版本和保存历史版本等。 3. 掌握可持久化splay树的常见应用场景,比如区间修改和区间查询等。 4. 深入了解与可持久化splay树相关的其他数据结构和算法,比如可持久化线段树等。 在解决问题时,可以使用二分法来确定答案,一般称为二分答案。通过对答案进行二分,然后对每个答案进行检查,以确定最终的结果。这种方法可以应用于很多问题,比如引用提到的在线询问问题。 综上所述,可持久化splay是一种对splay树进行修改和查询的扩展,可以通过复制节点来创建新的版本,并且可以与其他数据结构相结合解决更复杂的问题。学习过程可以按照一定的步骤进行,并且可以使用二分法来解决一些特定的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [[学习笔记]FHQ-Treap及其可持久化](https://blog.csdn.net/weixin_34283445/article/details/93207491)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [可持久化数据结构学习笔记](https://blog.csdn.net/weixin_30376083/article/details/99902410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值