序列化 Serialization 与 Java 对象序列化

  1. 什么是序列化:

    在计算中,序列化(或序列化)是将数据结构或对象状态转换为可以存储(例如,在文件或内存缓冲区中)或传输(例如,通过网络连接链接)并重构的格式的过程。

    注意:序列化是计算机的概念,Java序列化只是其中一种规范方式。很多Java开发者容易将这两个混淆。

  2. 序列化的方式有:JSON、XML、YAML、Java对象序列化、PHP序列化等。

  3. Java序列化:

    将对象转换为字节流(字节数组byte[])。可以将这些字节流保存为文件、或通过网络传输。

    3.1 Java序列化的实现是通过 ObjectOutputStream 类来实现的。

    3.2 Serializable接口,是实现Java序列化的规范,并不是序列化本身:对象需要实现该接口才能进行Java序列化。

    注意:Serializable是实现Java序列化的规范,和其他序列化没有直接关系。

    3.3 serialVersionUID:

    对象继承 Serializable 后,一定会产生该值。(当没有显式声明该值时,JDK会随机产生一个值,为保证反序列化的正常,最好定义一个固定值:一般1L

    可以看到 JDK 中的String、Integer、ArrayList等对象,都有实现Serializable,并将serialVersionUID声明一个确定值。

    3.4 基本数据类型(byte、short、int、long等等)是可以直接序列化的。

    3.5 transient 关键字:

    声明字段序列化中表示瞬时状态,不会被序列化。

    transient 是Java序列化中的规范,第三方的序列化不一定会遵守这个规范。

    3.6 static 修饰的字段不会被序列化,与变量在JVM中的存储有关。虽然 static 也修饰了 serialVersionUID,但是还是会将这个版本号进行序列化

    3.7 Javabean 中使用Integer 而不使用int 是因为Integer 可以表示null,int 默认值为0

    3.8 Java序列化的使用:

    通过序列化的字节流实现深度克隆

    ActiveMQ消息中间件中的 ObjectMessage(可以配置开启/关闭Java序列化的使用)

    tomcat 可以将 HttpSession 序列化到磁盘,在重启的时候避免session丢失,早期的 tomcat 集群通过这种方式实现session共享。

    基于 RMI(远程方法调用) 的分布式框架

  4. Spring中第三方序列化的使用

    JPA:添加 transient 关键字还是会保存到数据库,需要添加 @Transient 注解。可以不用实现 Serializable,但是 JPA 官方建议实现 Serializable

    JDBC:transient 关键字有效,但是并不是通过 Java 对象序列化来实现,而是通过setInt、setString来实现的。jdbc遵守了 transient 约定,但没有遵守 Serializable 约定。
    JavaBean 可以不用实现 Serializable

    JSON:SpringBoot 通过 Jackson 库来实现。
    关键类:MappingJackson2HttpMessageConverter
    @ResponseBody 序列化
    @RequestBody和@RequestParam反序列化
    忽略序列化通过注解 @JsonIgnore 来实现
    Jackson完全不遵守 Java 序列化规范。
    文档明确表示:因为没有使用 Java 序列化,减少语义混淆,最好不要 implements Serializable。

    第三方库有的遵守,有的不遵守。 Sun公司的Java 规范中:所有 Javabean 最好实现 Serializable 接口。
    对于我们普通Java程序员来说:按照Java规范来做,谁也不知道第三方库更新后是什么态度。

中文参考资料:
1.百度百科-序列化
2.segmentfault-序列化的意义及用途
3.CSDN-Java序列化的实际使用
4.CSDN-Java序列化和反序列化
5.CSDN-利用序列化和反序列化实现深克隆
6.CSDN-Java各种基本数据类型的序列化
7.CSDN-ObjectInputStream源码分析

Wiki and StackOverflow:
1.wiki-Serialization
2.wiki-JavaBeans
3.StackOverflow-Java Serializable Object to Byte Array
4.StackOverflow-Why JPA entities should implement Serializable
5.StackOverflow-SpringBoot中RestFul接口中是否需要实现Serializable
6.EndPoint-Spring中Rest接口序列化问题
7.StackOverflow-Jackson是使用Java序列化还是完全独立?
8.StackOverflow-JavaBean是否需要Serializable,JDBC和Java序列化的关系
9.StackOverflow-Java序列化的目的
10.StackOverflow-Java序列化,JSON,XML的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值