序列化可以解决分布式系统节点间复杂对象传输的问题. 将对象状态转化为可存储或可传输的过程叫序列化, 而反序列化是将其还原成对象的过程.

几种序列化机制

JDK的序列化

Java默认的序列化要求实现Serializable接口.

缺点:

  1. 序列化的结果比较大, 占用字节多, 传输效率低
  2. 仅Java实现, 不能跨语言

WebService

基于XML格式的传输.

Json方式

缺点:

  1. 结果依然较大
  2. 性能低

二进制传输

MessagePack
Protocal Buffer

Java的默认方式

// 使用了lombok
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car implements Serializable{// 版本号, java通过此版本号是否一致判断是否可以执行反序列化// 名称的数据类型必须准确,否则只是相当于定义一个普通的静态变量public static long serialVersionUID = -1244L;// 静态变量不序列化public static int age = 10;// 用protobuffer的话, 需要field上加Protobuffer的注解@Protobuf(fieldType = FieldType.INT32,order = 1)private int wheels;@Protobuf(fieldType = FieldType.STRING,order = 2)private String name;// 瞬时变量, 不被序列化private transient String desc;public static void main(String[] args) throws IOException, ClassNotFoundException {//serializeCar();Car car = deSerializeCar();System.out.println(car.age);System.out.println(car.toString());}private static void serializeCar() throws IOException {ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("car")));Car car = new Car(4, "BMW", "fast....");objectOutputStream.writeObject(car);car.age = 12;objectOutputStream.close();}private static Car deSerializeCar() throws IOException, ClassNotFoundException {ObjectInputStream objectInputStream;objectInputStream = new ObjectInputStream(new FileInputStream(new File("car")));Car car = (Car) objectInputStream.readObject();return car;}
}
  1. static final long serialVersionUID = -124L; 序列化版本号, 一致的版本才可以反序列化
  2. 静态变量不参与序列化
  3. transient 修饰的变量不序列化
  4. 父类实现序列化接口,子类会继承; 子类实现但父类不实现, 则父类的字段不被序列化(代码略)
  5. 序列化对象的存储: 同一对象的序列化,第二次将只存储第一个的引用及变化的部分,这样可以节省空间(代码略)
  6. 实现深克隆, 参看设计模式五: 原型模式(Prototype)

常用序列化协议

  • Json: Json是比较流行的序列化机制, Spring 默认的json序列化是使用Jackson, 阿里的FastJson效率更高且更易于使用.
  • Protobuffer: 二进制序列化有性能和传输方面的优势. 还有MessagePackage
  • Hessian2, Dobbo使用此协议
  • XML
  • FST
// FastJson的序列化和反序列化
String strJson = JSON.toJSONString(object);
Object object = JSON.parse(text);//Hessian的序列化
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Hessian2Output hessian2Output = new Hessian2Output(byteArrayOutputStream);
hessian2Output.writeObject(object);//Protobuffer的序列化
Codec<Car> carCodec = ProtobufProxy.create(Car.class, false);
byte[] bytes = carCodec.encode(object);

序列化需要引用相关的包, 下面列出几个.

<!--jackson的序列化包-->
<dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version>
</dependency><!--fastjson的序列化包-->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.49</version>
</dependency><!--Protobuffer的序列化包,由百度封装,增加了易用性-->
<dependency><groupId>com.baidu</groupId><artifactId>jprotobuf</artifactId><version>2.2.5</version>
</dependency><!--hessian的序列化包-->
<dependency><groupId>com.caucho</groupId><artifactId>hessian</artifactId><version>4.0.51</version>
</dependency>

分布式系列三: 对象序列化相关推荐

  1. 大型分布式C++框架《三:序列化与反序列化》

    一.前言 个人感觉序列化简单来说就是按一定规则组包.反序列化就是按组包时的规则来接包.正常来说.序列化不会很难.不会很复杂.因为过于复杂的序列化协议会导致较长的解析时间,这可能会使得序列化和反序列化阶 ...

  2. 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、并且——queryset对象序列化...

    第三百零九节,Django框架,models.py模块,数据库操作--F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...

  3. 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段

    2019独角兽企业重金招聘Python工程师标准>>> 剖析Elasticsearch集群系列之二:分布式的三个C.translog和Lucene段 博客分类: java 搜索引擎, ...

  4. WCF入门(三)——对象序列化

    对象序列化 WCF是通过网络实现远程方法调用的,因此参数,返回值等都需要序列化才能在网络间传输.例如,对于下面的一个服务: [ServiceContract]     public interface ...

  5. python封装函数、实现将任意的对象序列化到磁盘上_Python系列之lambda、函数、序列化...

    lambda 在python中使用lambda来创建匿名函数,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python lambda还有哪些和def不一样呢? 1 python la ...

  6. java对象序列化克隆_Java8基础知识(三)对象克隆与序列化

    对象克隆 对象克隆最简单的方式是:将对原对象的引用直接传给一个新的副本变量.这种方式存在很大的缺陷,两个变量中任何一个变量的改变都会影响另一个变量. 浅拷贝 利用Object类的clone方法,能够创 ...

  7. java 反射 transient_JAVA 对象序列化(三)——transient以及Externalizable的一种替代方法(使用Serializable)...

    transient(瞬时)关键字 当我们队序列化进行控制时,可能某个特定子对象不想让Java的序列化机制自动保存与恢复.如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通常就会面临这种情况 ...

  8. 数据库MYSQL学习系列三

    数据库MYSQL学习系列三 三.MYSQL事务与存储引擎 3.1-数据库事务 什么是事务 一系列有序的数据库操作: o要么全部成功 o要么全部回退到操作前的状态 o中间状态对其他连接不可见 事务的 ...

  9. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

最新文章

  1. CentOS5.4下安装短信猫
  2. Android 平台的Crash崩溃捕获-全
  3. 鸿蒙系统的升级名单,首批升级鸿蒙系统的名单确认,华为安卓系统将成为过去式!...
  4. java ee空指针_Java EE 7是最终版本。 思想,见解和进一步的指针。
  5. 使用Maven 创建web3.0项目
  6. 用Dart搭建HTTP服务器(3)
  7. 事件对象以及事件委托(pink老师笔记)
  8. C语言计算机题库第91套,二级c语言上机题库 2013年9月全国计算机等级考试二级C语言上机题库100套.doc...
  9. java 纯真ip数据库_纯真IP数据库格式读取方法(JAVA/PHP/Python)
  10. google paly发布app设备兼容性的识别
  11. 2019-02-13 思考:1000瓶药水,1瓶有毒,老鼠毒发24h,如何用最少的老鼠在24h内找出毒药?
  12. 断网后parsec无法检测发现台式机设备的解决办法
  13. 借助ADB冻结与卸载Android系统应用(免ROOT)
  14. php制作网页教程pdf,php中pdf页面制作方法
  15. 对象认知全提升,成为 JS 高手
  16. 如何实现修改c语言题库,编程培训 所有C语言题库(修改后).docx
  17. 高红梅:第一章 ​​​​​​​第二节 文学创作与自我身份认同问题
  18. 量化投资实战(二)之配对交易策略---最短距离法
  19. WPF:Loading等待动画、加载动画
  20. 关于计算机科学的课题,计算机与科学论文选题推荐 计算机与科学论文题目如何定...

热门文章

  1. excel 按数据拆分 xlam_Excel表格把数据按类别快速拆分到不同工作表或工作簿
  2. php fpm最大连接数,PHP最大连接数的设置及php-fpm高并发参数调整
  3. 12C ORA-错误汇总6 ORA-07500 to ORA-09859
  4. 有jar包直接加密tcp请求报文_干货 | 终于有人能把TCP/IP 协议讲明白了!
  5. 【linux】centos7下使用LAMP架构实现zabbix 4.0部署
  6. java计算机毕业设计客户台账管理源程序+mysql+系统+lw文档+远程调试
  7. 打印函数 lodop
  8. Affinity Matrix(关联矩阵,相似度矩阵),Cosine Similarity, Jaccard similarity
  9. python写软件实例-30分钟学会用Python编写简单程序
  10. 新手如何开始游戏建模?从0基础到学会制作,你需要掌握的技术