一、理解

Serializable接口是启用其序列化功能的接口。实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。


序列化:把对象转化为字节序列的过程称之为对象的序列化

反序列化:反之,称之为反序列化


Java Serialize序列化机制缺点:

  1. 序列化数据结果比较大、传输效率比较低

  2. 不能跨语言对接

Java Serialize序列化机制优点:

1 . 恰当的序列化协议不仅可以提高系统的通用性、强壮型、安全性、优化性能。同时还能让系统更加易于调试和扩展。


历史的选择:Xml ->JSON->二进制:

以至于在后来的很长一段时间,基于XML格式编码的对象序列化机制成为了主流,一方面解决了多语言兼容问题,另一方面比二进制的序列化方式更容易理解。以至于基于XML的SOAP协议及对应的WebService框架在很长一段时间内成为各个主流开发语言的必备的技术。

再到后来,基于JSON的简单文本格式编码的HTTP REST接口又基本上取代了复杂的Web Service接口,成为分布式架构中远程通信的首要选择。但是JSON序列化存储占用的空间大、性能低等问题,同时移动客户端应用需要更高效的传输数据来提升用户体验。在这种情况下与语言无关并且搞笑的二进制编码协议就成为了大家追求的热点技术之一。首先诞生的一个开源的二进制序列化框架-MessagePack。它比google的Protocol Buffers出现得还要早。


二、如何使用,注意事项

如何去实现序列化接口:

  1. 实现Serializable接口 (implements Serializable)
  2. 定义 serialVersionUID: 保证可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法或者属性可以用。
  3. ObjectOutputStream :表示把对象序列化成字节。
  4. ObjectInputStream  : 表示读取指定的字节数据转换成对象。

代码案例:

package com.gupao.vip.serialize.demo1;/*** Description:* User: zhurong* Date: 2018-08-12  21:42*/
public class User {public int userId = 1000;public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}@Overridepublic String toString() {return "User{" +"userId=" + userId +'}';}
}
package com.gupao.vip.serialize.demo1;import java.io.Serializable;/*** Description:* User: zhurong* Date: 2018-08-12  13:55*/
public class Person extends User implements Serializable{private static final long serialVersionUID = -1253674415533427994L;private String name;private static int age;private transient String address;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age + '\'' +", userId=" + userId +",address="+ address +'}';}
}
package com.gupao.vip.serialize.demo1;import java.io.*;/*** 序列化和反序列化* Description:* User: zhurong* Date: 2018-08-12  13:52*/
public class SerializeDemo {public static void main(String[] args) throws IOException {ServializePerson();DeServializePerson();}public static void ServializePerson() throws IOException {ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("person")));Person person = new Person();person.setAge(32);person.setName("zhagnsan");person.setUserId(9999);//父类oo.writeObject(person);person.setAge(20);
//        person.setUserId(9999);person.setName("lisi");oo.close();}public static void DeServializePerson() throws IOException {ObjectInputStream oo = new ObjectInputStream(new FileInputStream(new File("person")));Person person = null;try {person = (Person) oo.readObject();} catch (ClassNotFoundException e) {e.printStackTrace();}System.out.println(person.toString());oo.close();}
}

总结:

1、在java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化
2、通过ObjectOutputStream和ObjectInputStream对对象进行序列化合反序列化操作
3、对象是否允许被反序列化,不仅仅是取决于对象的代码是否一致,同时还有一个重要的因素(UID)
4、序列化并不保存静态变量的状态,如果已经序列化到一个文本里,如果再去改变该对象中的静态属性,那么反序列化之后这个静态的值是改变值之后的值。
5、要想父类对象也参与序列化操作,那么必须要让父类也实现Serializable接口
6、Transient关键字,主要是控制变量是否能够被序列化。如果没有被序列化的成员变量反序列化后,会被设置成初始值,比如String -> null
7、通过序列化操作实现深度克隆。
8、对同一个对象进行多次写入,打印出的第一次存储结果和第二次存储结果,只多了5(eg)个字节的引用关系。
并不会导致文件累加

java序列化机制Serialize接口使用相关推荐

  1. 一篇文章搞定java序列化机制

    序列化与反序列化 序列化:将对象的状态信息转换为可以存储或传输的数据形式(比如二进制)的过程. 反序列化:与序列化相对,把序列化转换成的可以存储或传输的数据形式转化为对象的状态信息的过程. java序 ...

  2. Java序列化机制和原理

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

  3. Java序列化机制——protoStuff

    Java的序列化是在文件传输中必不可少的一部分.常用的Java序列化机制有Java默认的序列化机制,谷歌的protobuf等.而Java默认的序列化机制效率太低,protobuf要写protostuf ...

  4. java序列化机制之protoStuff

    之前曾经写了两篇java的序列的机制,一种是默认的java序列化机制,这种方式效率太低.另外一种是谷歌的protobuf,但是这种我们还要写proto文件,并且我们还要使用工具来编译生成java文件, ...

  5. Java序列化机制原理,java面试题,java基础笔试题,BAT

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. Ja ...

  6. Java序列化(Serialize)

    本文转自:https://www.cnblogs.com/xdp-gacl/p/3777987.html 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象 ...

  7. java transient关键字_嗯?你真的会用 Java 序列化机制?

    码农每日一题长按关注,工作日每天分享一个技术知识点. 一.序列化.反序列化概念及其使用场景 1.序列化.反序列化的概念 简单的讲,序列化就是将java对象转化成二进制保存到磁盘中去,反序列化就是从磁盘 ...

  8. Java序列化的机制和原理

    有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍. Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述 ...

  9. java序列化算法透析_Java序列化机制与原理的深入分析

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

最新文章

  1. DAY9-python并发之多线程理论
  2. 在C/C++代码中使用SSE等指令集的指令(1)介绍
  3. 【Java从入门到天黑|05】JavaSE入门之面向对象(下)
  4. cookie无法读取bdstoken_Web自动化测试:对cookie的操作
  5. 函数式编程 -- 函数组合
  6. 【华为云技术分享】揭秘华为云DLI背后的核心计算引擎
  7. vue内容横向循环滚动_Vue替代marquee标签超出宽度文字横向滚动效果
  8. python爬虫之bs4库_三分钟搞定bs4库的解析器
  9. AEF横空出世——查询语法详解
  10. CentOS7上实现Squid缓存服务器的两种模式
  11. hadoop2.2完全分布式最新高可靠安装文档
  12. 如何卸载红蜘蛛多媒体网络教室软件
  13. Windows 10 全新界面来了:焕然一新!
  14. python 加汉明窗_什么是汉明窗?加Hanmming窗的作用?
  15. 小白教程系列——XMind8 Pro下载安装
  16. Redis入门完整教程:CacheCloud用户功能
  17. Android集成高德地图导航SDK、实现App内进行导航、打开高德App导航
  18. FastReport 打印二维码多一位
  19. 苹果手机网速慢_都2020年了,该不该换5G手机?
  20. 解决Android弹出Dialog小米手机需要打开“后台弹出界面”的权限问题

热门文章

  1. PayPal Data Scientist实习面试经历
  2. 不要紧张,一切尽在掌握:应激源可控性的神经相关因素
  3. 操作系统实验二实验报告
  4. 伙伴系统之伙伴系统概述--Linux内存管理(十五)
  5. 重磅丨十四五国家信息规划:部署了10项重大任务,10项优先行动(附PDF原文)...
  6. iptables日志管理
  7. python openpyxl load_workbook报AttributeError: 'MergedCell' object attribute 'hyperlink' is read-only
  8. 知识图谱实践(网易课程, 汽车)
  9. python实现在图片上画框并标注
  10. 1083: 阶乘尾数零的个数