为什么用到Java序列化?

本文解释了Java对象序列化的目的并非仅限于保存到硬盘,而是为了跨平台传输。通过序列化,Java对象可以被转换为所有平台都能识别的通用格式,便于客户端与服务器间的数据交换。

很多人觉得自己写得 Java 代码中,新建的 pojo 对象要实现序列化是为了要保存到硬盘上,其实呢,实现序列化和保存到硬盘上没有必然的关系。

以下图举例:

假设左边的是你的电脑,也就是客户端,右边的是服务器。之前你的客户端和服务器可能都在同一个电脑上,都是 Windows 下,那么右边的服务器也可以放到 Linux 中,这就涉及到左右两个不同的服务器了。中间用一条竖线分隔一下。

客户端可以调用服务器,所以肯定要传递参数。假设你传递的是字符串,没有问题,所有的机器都可以识别正常的字符串。

那么现在假设你传递的参数是一个 Java 对象,比如叫 cat。服务器并没有那么智能,它并不会知道你传递的是一个 Java 对象,而不是其他类型的数据,它识别不了 Java 对象。

Java 对象本质上是 class 字节码,服务器并不能根据这个字节码识别出该 Java 对象。所以,要提供一个公共的格式,不仅 Windows 能识别,你的服务器也能识别的公共的格式。

我们将 Java 对象转换成公共的格式叫做序列化,将公共的格式转换成对象叫做反序列化。保存到磁盘只是序列化的一种表现形式。

就这么简单,小小的问题,希望对大家有所帮助
作者:我是徐老师呀
链接:https://www.jianshu.com/p/6284c6b7cc1f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java 序列化是将 Java 对象转换为字节序列的过程,反序列化则是将字节序列恢复为 Java 对象的过程。 ### 原理 在网络传输中,发送方需要将 Java 对象转换为字节序列,然后在网络上传送,接收方收到字节序列后,通过反序列化将其恢复成 Java 对象。在 RPC 远程调用过程中,调用者和被调用者必须约定好序列化反序列化算法,例如 A 应用将 User 对象序列化为 JSON 数据传给 B 应用,B 应用需要采用相同的 JSON 序列化算法才能成功解析出 User 对象 [^3][^5]。 ### 方法 通过实现 Serializable 接口,可以轻松地将对象序列化为字节流,并在需要时将其反序列化为对象。还可以使用 transient 关键字、serialVersionUID、自定义序列化方法以及 Externalizable 接口,更细粒度地控制序列化过程 [^2]。 ### 应用 - **数据持久化**:通过序列化可以把数据持久地保存在硬盘上(磁盘文件),将对象存储到文件中时进行序列化,从文件中读取对象时需要反序列化 [^3][^4]。 - **远程通信**:利用序列化实现远程通信,在网络上传输字节序列,分布式传递对象或者网络传输时需要序列化 [^3][^4]。 - **缓存数据库**:存入缓存数据库(如 Redis)时需要用到序列化,将对象从缓存数据库中读取出来需要反序列化 [^4]。 ### 示例代码 以下是一个简单的 Java 序列化反序列化的示例: ```java import java.io.*; // 实现 Serializable 接口 class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class SerializationExample { public static void main(String[] args) { // 创建一个 Person 对象 Person person = new Person("John", 30); // 序列化对象 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) { oos.writeObject(person); System.out.println("对象已序列化"); } catch (IOException e) { e.printStackTrace(); } // 反序列化对象 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) { Person deserializedPerson = (Person) ois.readObject(); System.out.println("反序列化对象: " + deserializedPerson.getName() + ", " + deserializedPerson.getAge()); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值