基础概念

  • 把对象等转为二进制进行传输的是序列化,反之为反序列化;
  • 应用场景一般为读写文件,传输数据/接口调用;

Externalizable和Serializable

java的序列化方式有两种;

Serializable是常用的方法,实现方法为

class User implements Serializable {
private static final long serialVersionUID = -3226152074589523662L;
...
}

实现接口,并且最好有序列化ID;

Externalizable是Serializable的子类,但不会自动化序列化,需要调用方法实现序列化;

idea自动生成序列化ID

打开设置中的检测,然后每次有需要序列化的,生成一个Long型即可

Intellij idea用快捷键自动生成序列化id

序列化ID也可以是自定义的,比如简单的1L,只要调用方和被调用方约定一致即可;

transient关键字

  • transient修饰的变量,不会被序列化;
  • 静态变量一定不会被序列化(类的属性而不是对象的属性值)
  • 一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问;
  • transient关键字只能修饰变量,而不能修饰方法和类;
  • 使用Externalizable可以序列化transient修饰的变量
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.testng.annotations.Test; import java.io.*; @Slf4j
public class TestTransient { // private static final long serialVersionUID = 8204877978271765366L; @Test
public void testTransi(){
User user = new User("andy","123456");
log.info("Before serializable,user={}",user.toString());
try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/user.txt"));
os.writeObject(user);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
try { ObjectInputStream is = new ObjectInputStream(new FileInputStream("D:/user.txt"));
user = (User) is.readObject();
is.close();
log.info("After serializable,username={},pwd={}",user.getUsername(),user.getPassword());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} @Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
static class User implements Serializable {
private static final long serialVersionUID = -3226152074589523662L;
String username;
transient String password;
}
}

还需要注意的几个问题

  • 虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致
  • 要想将父类对象也序列化,就需要让父类也实现Serializable 接口。如果父类不实现的话的,就需要有默认的无参的构造函数
  • 可以尝试使用序列化实现加密控制等(Override),参考RMI技术
  • 注意往一个文件中多次写入同一个对象的情况

Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,上面增加的 5 字节的存储空间就是新增引用和一些控制信息的空间。反序列化时,恢复引用关系,使得清单 3 中的 t1 和 t2 指向唯一的对象,二者相等,输出 true。该存储规则极大的节省了存储空间。

参考文章

最新文章

  1. Hibernate连接mysql数据库的配置
  2. 解决在ScrollView中套用ListView显示不正常
  3. ccf模板生成
  4. 为网站添加ico图标
  5. <转载>DB2常用命令
  6. arp -s 157.55.85.212 00-aa-00-62-c6-09 .... Adds a static entry.
  7. WIN服务器出现 php-cgi.exe - FastCGI 进程意外退出
  8. webkit的基本应用
  9. HttpClient文件上传下载
  10. Bootstrap3入门
  11. js小功能合集:计算指定时间距今多久、评论树核心代码、字符串替换和去除。
  12. linux从入门到精通学习-NFS
  13. 使用 ESXi 虚拟化 Ryzen 1700
  14. string类的简洁版实现
  15. 第8章 概述 - Identity Server 4 中文文档(v1.0.0)
  16. PS制作水火相溶特效文字图片
  17. vw实现移动端自适应页面
  18. Windows安装MongoDB
  19. Hive之变量和属性
  20. 关于tp5 的验证码遇到的一些问题

热门文章

  1. Windows下Redis的安装与部署
  2. 条款50: 提高对C++的认识
  3. [容斥原理] hdu 1796 How many integers can you find
  4. OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)
  5. LeetCode 645. Set Mismatch (集合不匹配)
  6. 学习一点汇编 INT 16H指令
  7. bzoj3545
  8. vue单页面应用刷新网页后vuex的state数据丢失问题以及beforeunload的兼容性
  9. Linux 文件和目录操作 - cd - 切换目录
  10. smarty用法