序列化与反序列化概念

news2024/12/23 11:00:27

e55b9bd2aea04867a9bda0e08eec1c20.gif序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。

 

 

在Java中创建的对象,只要没有被回收就可以被复用,但是,创建的这些对象都是存在于JVM的堆内存中,JVM处于运行状态时候,这些对象可以复用,

 

但是一旦JVM停止,这些对象的状态也就丢失了。

 

在实际生活中,需要将对象持久化,需要的时候再重新读取出来,通过对象序列化,可以将对象的状态保存为字节数组,需要的时候再将字节数组反序列化为对象。

 

对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间转换,广泛用于RMI(远程方法调用)以及网络传输中。

 

 

 

特别注意:

 

a.静态成员变量属于类不属于对象,所以不会参与序列化(对象序列化保存的是对象的“状态”,也就是它的成员变量,因此序列化不会关注静态变量)

 

b.用transient关键字标记的成员变量不参与序列化(在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null)

 

 

 

(1).Serializable

 

1 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

复制代码

 1 import java.io.Serializable;

 2 

 3 public class StudentSerializable implements Serializable {

 4     

 5 //指定serialVersionUID,

 6 //因为原则上序列化后的数据中的serialVersionUID只有和当前类的serialVersionUID相同时才能被正常的反序列化

 7 //最好自己指定UID或者系统生成,因为如果增加或者删除了某些成员变量,那么系统就会重新生成hash值然后赋给UID,导致反序列化时候crash

 8 private static final long serialVersionUID = 10000000000000000L; 

 9     

10 private int Uid;

11 private String Name ;

12     

13 public int getUid() {

14 return Uid;

15 }

16 public void setUid(int uid) {

17 Uid = uid;

18 }

19 public String getName() {

20 return Name;

21 }

22 public void setName(String name) {

23 Name = name;

24 }

25 @Override

26 public String toString() {

27 return "StudentSerializable [Uid=" + Uid + ", Name=" + Name + "]";

28 }

29 

30 }

复制代码

复制代码

 1 private void DealSerializable() throws IOException {

 2 // Initializes The Object

 3 StudentSerializable stu = new StudentSerializable();

 4 stu.setUid(9027);

 5 stu.setName("fish");        

 6         

 7 File extDir = Environment.getExternalStorageDirectory();

 8 String filename = "tempFile.txt";

 9 File fullFilename = new File(extDir, filename);

10          

11 try {

12 fullFilename.createNewFile();

13 fullFilename.setWritable(Boolean.TRUE);

14 fullFilename.setReadable(Boolean.TRUE);

15              

16 } catch (IOException e) {

17 // TODO Auto-generated catch block

18 e.printStackTrace();

19 }

20 

21 // Write Obj to File

22 ObjectOutputStream oos = null;

23 try {

24 oos = new ObjectOutputStream(new FileOutputStream(fullFilename.getAbsoluteFile()));

25 oos.writeObject(stu);

26 } catch (IOException e) {

27 e.printStackTrace();

28 } finally {

29 //oos.close();

30 }

31 

32 // Read Obj from File

33 //File file = new File("tempFile.txt");

34 ObjectInputStream ois = null;

35 try {

36 ois = new ObjectInputStream(new FileInputStream(fullFilename.getAbsoluteFile()));

37 StudentSerializable newStu = (StudentSerializable) ois.readObject();

38 System.out.println(newStu);

39 } catch (IOException e) {

40 e.printStackTrace();

41 } catch (ClassNotFoundException e) {

42 e.printStackTrace();

43 } finally {

44 //ois.close();

45 }

46 }

复制代码

 

 

 在使用时,通常是和ObjectOutputStream 以及 ObjectInputStream 配套一起使用,准确的说是和ObjectOutputStream 里的writeObject () 和 ObjectInputStream 里的 readObject () 一起使用。writeObject()方法是最重要的方法,用于对象序列化。如果对象包含其他对象的引用,则writeObject()方法递归序列化这些对象。

 

 

 

(2).Parcelable

 

复制代码

 1 import android.os.Parcel;

 2 import android.os.Parcelable;

 3 

 4 public class StudentParcelable implements Parcelable{

 5     

 6 private int Uid;

 7 private String Name ;

 8     

 9 private Book book ;

10     

11 public StudentParcelable(int uid, String name) {

12 super();

13 Uid = uid;

14 Name = name;

15 }

16     

17 public int getUid() {

18 return Uid;

19 }

20 public void setUid(int uid) {

21 Uid = uid;

22 }

23 public String getName() {

24 return Name;

25 }

26 public void setName(String name) {

27 Name = name;

28 }

29 

30 

31 //功能:返回当前对象的内容描述,如果含有文件描述符,返回1

32 //即CONTENTS_FILE_DESCRIPTOR

33 //几乎所有情况都会返回0

34 @Override

35 public int describeContents() {

36 // TODO Auto-generated method stub

37 return 0;

38 }

39 

40 /**

41 * 序列化功能由writeToParcel完成,最终通过Parcel的一系列Write方法完成

42 */

43 //功能:将当前对象写入序列化结构中,其中flags标识有两种值,0或1

44 //为1时标识当前对象需要作为返回值返回,不能立刻释放资源,即PARCELABLE_WRITE_RETURN_VALUE

45 //不过几乎所有情况都为0

46 @Override

47 public void writeToParcel(Parcel dest, int flags) {

48 // TODO Auto-generated method stub

49 dest.writeInt(Uid);

50 dest.writeString(Name);

51 dest.writeParcelable(book, 0);

52 }

53     

54 /**

55 * 反序列化由CREATOR来完成,其内部标明了如何创建序列化对象和数组

56 * 并通过Parcel的一系列read方法来完成反序列化

57 */

58 public StudentParcelable(Parcel source){

59 Uid = source.readInt();

60 Name

 

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

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

相关文章

taobao.item.delete( 删除单条商品 )

&#xffe5;开放平台免费API必须用户授权 删除单条商品 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, s…

【深一点学习】自己实现一下卷积和池化操作,理解超参数意义,理清数学计算方式

二维卷积层 卷积神经网络&#xff08;convolutional neural network&#xff09;是含有卷积层&#xff08;convolutional layer&#xff09;的神经网络。本章中介绍的卷积神经网络均使用最常见的二维卷积层。它有高和宽两个空间维度&#xff0c;常用来处理图像数据。 二维互相…

Python、JavaScript、C、C++和Java可视化代码执行工具

Python、JavaScrip、C、C和Java可视化代码执行工具 该工具通过可视化代码执行来帮助您学习Python、JavaScript、C、C和Java编程。可在可视化区动态展示执行过程中的调用栈、相关变量以及对应的变量值。https://pythontutor.com/ 下面以执行下面python这段代码为例 class MyCla…

9万字“联、管、用”三位一体雪亮工程整体建设方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用。部分资料内容&#xff1a; 1、 总体设计方案 围绕《公共安全视频监控建设联网应用”十三五”规划方案》中的总体架构和一总两分结构要求的基础上&#xff0c;项目将以“加强社会公共安全管理&#xff0c;提高…

leetcode打卡-贪心算法

455.分发饼干 leetcode题目链接&#xff1a;https://leetcode.cn/problems/assign-cookies leetcode AC记录&#xff1a; 代码如下&#xff1a; public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int res 0;int sIndex 0;int gIndex 0…

Kafka生产者的粘性分区算法

分区算法分类 kafka在生产者投递消息时&#xff0c;会根据是否有key采取不用策略来获取分区。 存在key时会根据key计算一个hash值&#xff0c;然后采用hash%分区数的方式获取对应的分区。 而不存在key时采用随机算法选取分区&#xff0c;然后将所有的消息封装到这个batch上直…

2023/3/5 Vue学习笔记 - 生命周期函数探究-2

1 beforeCreated 在组件实例初始化完成之后立即调用。会在实例初始化完成、props 解析之后、data() 和 computed 等选项处理之前立即调用。 组件的组件实例初始化动作&#xff1a;初始化一个空的Vue实例对象&#xff0c;此时&#xff0c;这个对象身上只有一个默认的声明周期函…

Eureka注册中心快速入门

一、提供者与消费者**服务提供者&#xff1a;**一次业务中&#xff0c;被其他微服务调用的服务。&#xff08;提供接口给其他微服务&#xff09;**服务消费者&#xff1a;**一次业务中&#xff0c;调用其他微服务的服务。&#xff08;调用其它微服务提供的接口&#xff09;比如…

如何分辨on-policy和off-policy

on-policy的定义&#xff1a;behavior policy和target-policy相同的是on-policy&#xff0c;不同的是off-policy。 behavior policy&#xff1a;采样数据的策略&#xff0c;影响的是采样出来s,a的分布。 target policy&#xff1a;就是被不断迭代修改的策略。 如果是基于深度…

JavaSE学习笔记总结day18(完结!!!)

今日内容 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 五、线程状态 六、线程同步 零、 复习昨日 晨考 一、作业 见答案 二、进程与线程[了解] 一个进程就是一个应用程序,进程包含线程 一个进程至少包含一个线程,大部分都是有多条线程在执行任务(多线…

Win系统蓝牙设备频繁卡顿/断连 - 解决方案

Win系统蓝牙设备频繁卡顿/断连 - 解决方案前言常见网卡Intel无线网卡&#xff08;推荐&#xff09;Realtek无线网卡总结查看本机网卡解决方案更新驱动更换网卡&#xff08;推荐&#xff09;前言 无线网卡有2个模块&#xff0c;一个是WiFi&#xff0c;一个是蓝牙&#xff0c;因…

Kubernetes之存储管理(下)

动态卷供应 上篇文章讲述的持久性存储&#xff0c;是先创建pv&#xff0c;然后才能创建pvc。如果不同的命名空间里同时要创建不同的pvc&#xff0c;那么就需要提前创建好pv&#xff0c;这样才能为pvc提供存储。但是这种方式太过繁琐&#xff0c;可以使用storageClass&#xff…

yolov5算法,训练模型,模型检测

嘟嘟嘟嘟&#xff01;工作需要&#xff0c;所以学习了下yolov5算法。是干什么的呢&#xff1f; 通俗来说&#xff0c;可以将它看做是一个小孩儿&#xff0c;通过成年人&#xff08;开发人员&#xff09;提供的大量图片的学习&#xff0c;让自己知道我看到的哪些场景需要提醒给成…

MySQL底层存储B-Tree和B+Tree原理分析

1.B-Tree的原理分析 &#xff08;1&#xff09;什么是B-Tree B-树&#xff0c;全称是 Balanced Tree&#xff0c;是一种多路平衡查找树。 一个节点包括多个key (数量看业务)&#xff0c;具有M阶的B树&#xff0c;每个节点最多有M-1个Key。 节点的key元素个数就是指这个节点能…

Andorid:关于Binder几个面试问题

1.简单介绍下binderbinder是一种进程间通讯的机制进程间通讯需要了解用户空间和内核空间每个进程拥有自己的独立虚拟机&#xff0c;系统为他们分配的地址空间都是互相隔离的。如两个进程需要进行通讯&#xff0c;则需要使用到内核空间做载体&#xff0c;内核空间是所有进程共享…

FL2440(S3C2440A 芯片) 开发板开发笔记

FL2440(S3C2440A 芯片) 开发板开发笔记 开发板的拨码开关指南&#xff1a; FL2440 改 vnfg 飞凌嵌入式 www. witech. com. cn 09. 8. 22 1 开发板使用手册 version4. 0 FL2440 保定飞凌嵌入式技术有限公司 网站&#xff1a;http: //www. witech. com. cn http: //www. he…

动态规划之买卖股票问题

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓动态规划之买卖股票问题 &#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 动态规划算法本质上就是穷举…

synchronized底层

Monitor概念一、Java对象头二、Monitor2.1、Monitor—工作原理2.2、Monitor工作原理—字节码角度2.2、synchronized进阶原理&#xff08;优化&#xff09;2.3、synchronized优化原理——轻量级锁2.4、synchronized优化原理——锁膨胀2.5、synchronized优化原理——自旋优化2.6、…

VUE3-Cesium(加载GeoJSON数据)

目录 一、准备工作 1、新建vue项目 解决报错&#xff1a;使用nvm后找不到vue -V找不到版本 2、安装Cesium插件 3、安装 Element Plus、unplugin-vue-components 和 unplugin-auto-import 4、按需自动导入element-plus 测试按需自动导入element-plus是否配置成功 二、项…

2023年软考中级电子商务设计师考什么?

首先&#xff0c;电子商务设计师属于软考中级&#xff0c;因此难度也不是特别大。但并不是说就完全没有难度&#xff0c;难度还是有的&#xff0c;像上午题一般把基本知识点掌握了&#xff0c;是没什么问题的&#xff0c;重点就在于下午题会比较难。 接下来我们来剖析一下考试…