java 对象经常需要在网络中以 socket 传输或者需要保存到文件中。这时不管 java 对象是文件、数据、图像还是其他格式,都可以转换为一个 byte[] 数组保存到文件或者通过网络传输。这种转换方式就叫做序列化。将文件或者网络传输中得到的 byte[] 数组转换为 java 对象就叫做反序列化。
怎么使用
如果一个 Java 对象要能被序列化,必须实现一个特殊的 java.io.Serializable 接口
public interface Serializable {
}
Serializable 接口没有定义任何的方法,是一个空接口。为什么要有一个这样的接口?主要是因为安全。如果没有这个接口就代表着所有 java 对象都可以被序列化到磁盘上,然后通过反序列化看到所有属性的数据。有了这个 Serializable 就可以让开发人员选择 java 对象可以被序列化和反序列化,就增加了安全性。
序列化
下面例子是将一个 java 对象序列化后保存到文件。
import java.io.Serializable;
public class Order implements Serializable {
private Long orderId;
private String orderNo;
private String consignee;//收件人
private String deliveryAddress;//收货地址
//getter 和 setter
@Override
public String toString() {
return "OrderDTO{" +
"orderId=" + orderId +
", orderNo='" + orderNo + ''' +
", consignee='" + consignee + ''' +
", deliveryAddress='" + deliveryAddress + ''' +
'}';
}
}
把一个 Java 对象变为 byte[] 数组,需要使用 ObjectOutputStream。它负责把一个Java 对象写入一个字节流:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
OrderDTO orderDTO = new OrderDTO();
orderDTO.setOrderId(1L);
orderDTO.setOrderNo("123456");
orderDTO.setConsignee("李四");
orderDTO.setDeliveryAddress("xxx路xxx弄xxxx号");
OrderDTO orderDTO2 = new OrderDTO();
orderDTO2.setOrderId(2L);
orderDTO2.setOrderNo("78901");
orderDTO2.setConsignee("王五");
orderDTO2.setDeliveryAddress("yyy路yyy弄yyyy号");
List< OrderDTO > list = new ArrayList< >();
list.add(orderDTO);
list.add(orderDTO2);
FileOutputStream fos = new FileOutputStream("D:/order.txt");
try ( ObjectOutputStream os = new ObjectOutputStream(fos)){
os.writeObject(list);
}
System.out.println("序列化成功");
}
}
这个时候就将两个 OrderDTO 对象序列化到了 D:/order.txt 中。
反序列化
序列化文件在本地打开都是乱码的,这应该用反序列化将文件解析成对象。
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
List< OrderDTO > list = new ArrayList< >();
FileInputStream fis = new FileInputStream("D:/order.txt");
try (ObjectInputStream is = new ObjectInputStream(fis)) {
list = (List< OrderDTO >)is.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
for (OrderDTO orderDTO : list){
System.out.println(orderDTO.toString());
}
}
}
输出结果:
OrderDTO{orderId=1, orderNo='123456', consignee='李四', deliveryAddress='xxx路xxx弄xxxx号'}
OrderDTO{orderId=2, orderNo='78901', consignee='王五', deliveryAddress='yyy路yyy弄yyyy号'}
注意点
- 静态变量和 transient 关键字修饰的变量不能被序列化
- 反序列化的时候,字节流中的 serialVersionUID 和实体类中的 serialVersionUID 的不一致会抛出异常。serialVersionUID 没有写的话,会被默认一个。
- 序列化实现了深克隆,对象引用的每一个对象数据也会被序列化。
总结
- 序列化必须实现 Serializable。
- serialVersionUID 不是必须的。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
接口
+关注
关注
33文章
9603浏览量
157680 -
数据
+关注
关注
8文章
7349浏览量
95058 -
JAVA
+关注
关注
20文章
3012浏览量
116890 -
网络
+关注
关注
14文章
8340浏览量
95610
发布评论请先 登录
相关推荐
热点推荐
如何使用Serde进行序列化和反序列化
Serde 是一个用于序列化和反序列化 Rust 数据结构的库。它支持 JSON、BSON、YAML 等多种格式,并且可以自定义序列化和反序列化方式。Serde 的特点是代码简洁、易于
c语言序列化和反序列化有何区别
这里写自定义目录标题c语言序列化和反序列化tplut.htplut.c测试代码参考c语言序列化和反序列化网络调用,数据传输都需要把数据序列化
发表于 07-14 07:32
SpringMVC JSON框架的自定义序列化与反序列化
,也可以使用fastjson。jackson框架自定义序列化如果项目使用jackson框架做json序列化,推荐的方案是使用@JsonSerialize注解,示例代码如下:@JsonSerialize
发表于 10-10 16:02
Java对象序列化您不知道的5件事
本文是本系列的第一篇文章,这个系列专门揭示关于 Java 平台的一些有用 的小知识 — 这些小知识不易理解,但对于解决 Java 编程挑战迟早有用。
将 Java 对象序列化 API
发表于 11-23 17:53
•20次下载
java序列化和反序列化范例和JDK类库中的序列化API
一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反
发表于 09-27 10:13
•6次下载
java序列化的几种方式
一.Java序列化的作用 有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象。例如,有的时候我们想要 把一个
发表于 09-27 11:15
•0次下载
Java反序列化回显方法
同样修改yso中Gadgets要执行的java代码即可实现,通过将执行结果写入web目录下的静态文件再读取来实现。此法的缺点是当目标不存在可访问静态web目录便无法使用了且要获取web目录的绝对路径,更适用于已知开发框架的反序列化漏洞利用。
什么是序列化 为什么要序列化
什么是序列化? “序列化”(Serialization )的意思是将一个对象转化为字节流。 这里说的对象可以理解为“面向对象”里的那个对象,具体的就是存储在内存中的对象数据。 与之相反的过程是“反序列化
ROS中的序列化实现
理解了序列化,再回到ROS。我们发现,ROS没有采用第三方的序列化工具,而是选择自己实现,代码在roscpp_core项目下的roscpp_serialization中,见下图。这个功能涉及的代码量
如何用C语言进行json的序列化和反序列化
json是目前最为流行的文本数据传输格式,特别是在网络通信上广泛应用,随着物联网的兴起,在嵌入式设备上,也需要开始使用json进行数据传输,那么,如何快速简洁地用C语言进行json的序列化和反序列化
什么时候需要Boost序列化
程序开发中,序列化是经常需要用到的。像一些相对高级语言,比如JAVA, C#都已经很好的支持了序列化,那么C++呢?当然一个比较好的选择就是用Boost,这个号称C++准标准库的东西。 什么时候需要
Java序列化怎么使用
评论