近几天打算使用Delayed接口自定义实现一个简单的延迟队列功能,想把任务数据进行一个持久化的实现,但是又不想依赖数据库,又或者其他的第三方工具进行持久化的操作,就考虑到直接持久化到文件中。
而持久化到文件中又考虑到两种方案,一种是使用JSON追加保存,另一种是将对象进行序列化保存。最后,考虑到性能问题选择了序列化的方式。
在处理的过程中发现对象序列化不能像普通文件一样直接进行追加对象,每次写入对象都会被覆盖。
如果想把数据对象进行追加的话,最简单粗暴的方法就是。在追加序列化对象之前,先将对象读取出来,然后封装到一个list集合中,将新的对象添加在list集合里面,将整个集合进行一个序列化的保存。
虽然以上的方案确实可以实现序列化的追加被覆盖的问题,每次在储存对象的时候,都需要将整个对象集合读取出来再写入进去,数据量少的情况下还没啥影响,但是数据量大的时候太消耗性能了,那还不如直接转换成JSON格式储存好了。
最终,根据各种途径的资料查询发现。Java默认的对象序列化是每次都会写入一个头部aced 0005(占4个字节),然后每次读取都是读完头部然后再读取内容。
解决方案就是就储存文件数据之前,先创建一个空的序列化文件,将头部标记在文件中。在写入对象的时候,将对象中的4个头部字节aced 0005截取掉,就可以将对象写入到文件中,并实现了追加的功能。
实现Serializable接口对象
java复制代码
@Data
@AllArgsConstructor
public class Student implements Serializable {
private String name;
priva