#(序列化)

在实际的框架中,真正影响效率的就是数据的传输方式,以及传输的准备,或者说是tcp与http,序列化.当然要想提高整个框架的效率,需要采用一种高效的序列化

框架比如流行的protostuff.总结一些有点如下:

(1).Java序列化对象时不需要通过属性的get set方法或其它无关序列化内部定义的方法(比如readObject,writeObject是内置的序列化方法),序列化也不需要get set方法

支持,反序列化是构造对象的一种手段。

(2).Java序列化时类型必须完全匹配(全路径类名+序列化id)。

(3).Protostuff反序列化时并不要求类型匹配,比如包名、类名甚至是字段名,它仅仅需要序列化类型A 和反序列化类型B 的字段类型可转换(比如int可以转换为long)即可

#(demo)

先声明两个po类,不需要保证类的名称,以及属性的名,如下:

  1. public class PersonA {
  2. private String name;
  3. private int age;
  4. .....
  5. }
  6.  
  7. public class PersonB {
  8. private String nameB;
  9. private int ageB;
  10. .....
  11. }

下面再随便写一个方法跑起来:

  1. public static void test1() {
  2. PersonA personA = new PersonA("A", 12);
  3. byte[] arr = ProtoStuffUtil.serialize(personA);
  4. PersonB personB = ProtoStuffUtil.deserialize(arr, PersonB.class);
  5. }

在这个过程中,我们首先将A序列化成二进制码,然后又将二进制的A反序列化成B对象。

来看一下util的实现:

  1. public class ProtoStuffUtil {
  2. public static <T> byte[] serialize(T obj) {
  3. if (obj == null) {
  4. throw new RuntimeException("序列化对象(" + obj + ")!");
  5. }
  6. //主题,只要实现了一个主题就可以被序列化和反序列化
  7. Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(obj.getClass());
  8. LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
  9. byte[] protostuff = null;
  10. try {
  11. protostuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
  12. } catch (Exception e) {
  13. throw new RuntimeException("序列化(" + obj.getClass() + ")对象(" + obj + ")发生异常!", e);
  14. } finally {
  15. buffer.clear();
  16. }
  17. return protostuff;
  18. }
  19.  
  20. public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) {
  21. if (paramArrayOfByte == null || paramArrayOfByte.length == 0) {
  22. throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
  23. }
  24. T instance = null;
  25. try {
  26. instance = targetClass.newInstance();
  27. } catch (IllegalAccessException e) {
  28. throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e);
  29. } catch (InstantiationException e) {
  30. e.printStackTrace();
  31. }
  32. Schema<T> schema = RuntimeSchema.getSchema(targetClass);
  33. ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema);
  34. return instance;
  35. }
  36. }

使用起来就是这么简单.

最后献上管网地址一枚:http://www.protostuff.io/  

老王讲自制RPC框架.(四.序列化与反序列化)的更多相关文章

  1. 老王讲自制RPC框架.(一.前言与技术选型)

    (#)背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只 ...

  2. 老王讲自制RPC框架.(三.ZOOKEEPER)

    (#)定义Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配 ...

  3. 老王讲自制RPC框架.(二.动态代理)

    (#简介) 什么是动态代理?动态代理是实现阶段不关心代理是谁,而在运行阶段才指定代理对象是哪一个,动态代理在做框架方面使用非常 广泛,比如spring的aop,其核心就是采用动态代理机制,下面让我们来 ...

  4. 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架

    目录 一.前言 二.RPC 基础概念 1. RPC 是什么? 2. 需要解决什么问题? 3. 有哪些开源实现? 三.protobuf 基本使用 1. 基本知识 2. 使用步骤 四.libevent 1 ...

  5. RPC 框架

    RPC 谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol) RPC就是要像调用本地的函数一样去调远程函数. 推荐 ...

  6. RPC框架-通俗易懂的解释

    早期单机时代,一台电脑上运行多个进程,大家各干各的,老死不相往来.假如A进程需要一个画图的功能,B进程也需要一个画图的功能,程序员就必须为两个进程都写一个画图的功能.这不是整人么?于是就出现了IPC( ...

  7. python之路:变量与变量基本操作(老王版)

    python开发之路:变量与变量基本操作 你是一个师范大学的优秀毕业生,现在在某某小学工作. 你想:判作业真的很累,隔壁老王现在天天玩<蓝月传奇>,银行里存满了钱.唉,每节课1个小时,每个 ...

  8. RPC框架从0到10

    RPC(Remote Procedure Call) 从单机走向分布式,产生了很多分布式的通信方式 最古老也是最有效,并且永不过时的,TCP/UDP的二进制传输,事实上所有的通信方式归根结底都是TCP ...

  9. C#中的序列化与反序列化

    眼看XX鸟的课程关于C#的知识点就要学完了,翻看网络中流传的教程还是发现了一个课程中没有讲到的知识点:序列化与反序列化 无奈还是了解一下并操作一番,以备后用吧 介绍:就是将对象信息转化为二进制信息以便 ...

随机推荐

  1. ubuntu配置NFS

    ubuntu配置NFS: sudo apt-get install nfs-kernel-server 配置/etc/exports 例如:我们要将根目录下的 /opt/FriendlyARM/min ...

  2. 在虚拟机中配置FastDFS+Nginx模块

    先上部署图 提示一下, ip 192.168.72.138 上面部署了两个group, 分别为 group1和g2. 另外, 同组之内的 port 要保持一致. 一.安装准备 1. #每台机器都添加两 ...

  3. Swift

    1.Swift项目与OC项目的区别 - Swift的类文件是以 .swift 结尾 - main.m 不见了,程序入口以 `@UIApplicationMain` - Swift中,代码都是写到 `{ ...

  4. C#动态生成html页

    Html生成模块:WriteHtml.cs using System.Collections.Generic; using System.IO; using System.Text; namespac ...

  5. MongoDB - 在Windows上安装

    1 下载MongoDB社区版, 下载链接 http://www.mongodb.org/downloads?_ga=1.129742796.1997610832.1481940266 2 安装Mong ...

  6. HTTP请求 GET与POST是怎么实现?

    1.HTTP请求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP请求中, ...

  7. symfony安装笔记

    下载http://symfony.com/download,这里版本是2.8 将D:\ApacheServer\php路径添加到环境变量path中,在cmd命令行中可以执行php命令 打开php.in ...

  8. IE兼容性的注意点

    IE会将注释节点实现为元素,所以在IE中调用getElementsByTagName里面会包含注释节点,这个通常是不应该的 getElementById的参数在IE8及较低的版本不区分大小写 IE7及 ...

  9. poj 2774

    传送门:http://poj.org/problem?id=2774 裸的后缀数组,我只是为了贴个版而已 代码 #include <cstdio> #include <cmath&g ...

  10. 一个ubuntu phper的自我修养(workbench)

    workbench从此和navicat的激活码说再见 workbench是一个免费易用功能强大的mysql图形化管理软件,navicat上用到的功能,workbench上都能找到. 一.workben ...