Java序列化常见的三个问题

作者:xcbeyond 时间:2023-11-21 08:40:52 

1、Java序列化与反序列化是什么?

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

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

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

2、为什么需要序列化与反序列化?

为什么要序列化,那就是说一下序列化的好处喽,序列化有什么什么优点,所以我们要序列化。

一:对象序列化可以实现分布式对象。

主要应用例如:RMI(即远程调用Remote Method Invocation)要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。

可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

三:序列化可以将内存中的类写入文件或数据库中。

比如:将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。

总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。

四:对象、文件、数据,有许多不同的格式,很难统一传输和保存。

序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。

3、如何实现Java序列化与反序列化

首先我们要把准备要序列化类,实现 Serializabel接口

例如:我们要Person类里的name和age都序列化


import java.io.Serializable;

public class Person implements Serializable { //本类可以序列化

private String name;
 private int age;

public Person(String name, int age) {
   this.name = name;
   this.age = age;
 }

public String toString() {
   return "姓名:" + this.name + ",年龄" + this.age;
 }
}

然后:我们将name和age序列化(也就是把这2个对象转为二进制,理解为“打碎”)


package org.lxh.SerDemo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamDemo { //序列化
 public static void main(String[] args) throws Exception {
   //序列化后生成指定文件路径
   File file = new File("D:" + File.separator + "person.ser");
   ObjectOutputStream oos = null;
   //装饰流(流)
   oos = new ObjectOutputStream(new FileOutputStream(file));

//实例化类
   Person per = new Person("张三", 30);
   oos.writeObject(per); //把类对象序列化
   oos.close();
 }
}

来源:https://cloud.tencent.com/developer/article/1604372

标签:JAVA,序列化
0
投稿

猜你喜欢

  • Android开发之关于项目

    2023-05-08 23:38:24
  • java随机生成8位数授权码的实例

    2022-04-24 12:03:47
  • Android开发环境安装和配置图文教程

    2023-08-04 16:58:26
  • C#实现异步编程的方法

    2022-03-01 22:43:27
  • Android开发中ImageLoder进行图片加载和缓存

    2023-08-18 10:14:30
  • ListView实现聊天列表之处理不同数据项

    2022-07-01 01:06:58
  • 源码阅读之storm操作zookeeper-cluster.clj

    2022-06-01 13:21:48
  • java实现文件上传下载

    2023-11-23 09:41:18
  • 利用枚举法求直方图中最大矩形面积的方法实例

    2022-06-22 21:16:31
  • C#委托与冒泡排序实例

    2022-05-03 13:26:21
  • android 获取上一个activity返回值的方法

    2023-06-15 13:22:22
  • C#实现导入CSV文件到Excel工作簿的方法

    2022-09-13 12:24:02
  • Android通过代码控制ListView上下滚动的方法

    2022-06-29 03:07:57
  • 总结的5个C#字符串操作方法分享

    2022-08-10 04:02:01
  • C#实现HTTP上传文件的方法

    2023-04-28 04:05:30
  • 浅析C# 状态机Stateless

    2022-03-08 16:39:07
  • IDEA简单实现登录注册页面

    2023-08-06 19:10:37
  • idea搭建SSM框架遇踩的坑(附完整过程)

    2023-06-23 09:53:07
  • Mybatis一对多查询的两种姿势(值得收藏)

    2023-07-01 00:20:08
  • Android自定义textview实现竖直滚动跑马灯效果

    2023-09-30 07:42:05
  • asp之家 软件编程 m.aspxhome.com