老王讲自制RPC框架.(四.序列化与反序列化)
#(序列化)
在实际的框架中,真正影响效率的就是数据的传输方式,以及传输的准备,或者说是tcp与http,序列化.当然要想提高整个框架的效率,需要采用一种高效的序列化
框架比如流行的protostuff.总结一些有点如下:
(1).Java序列化对象时不需要通过属性的get set方法或其它无关序列化内部定义的方法(比如readObject,writeObject是内置的序列化方法),序列化也不需要get set方法
支持,反序列化是构造对象的一种手段。
(2).Java序列化时类型必须完全匹配(全路径类名+序列化id)。
(3).Protostuff反序列化时并不要求类型匹配,比如包名、类名甚至是字段名,它仅仅需要序列化类型A 和反序列化类型B 的字段类型可转换(比如int可以转换为long)即可
#(demo)
先声明两个po类,不需要保证类的名称,以及属性的名,如下:
- public class PersonA {
- private String name;
- private int age;
- .....
- }
- public class PersonB {
- private String nameB;
- private int ageB;
- .....
- }
下面再随便写一个方法跑起来:
- public static void test1() {
- PersonA personA = new PersonA("A", 12);
- byte[] arr = ProtoStuffUtil.serialize(personA);
- PersonB personB = ProtoStuffUtil.deserialize(arr, PersonB.class);
- }
在这个过程中,我们首先将A序列化成二进制码,然后又将二进制的A反序列化成B对象。
来看一下util的实现:
- public class ProtoStuffUtil {
- public static <T> byte[] serialize(T obj) {
- if (obj == null) {
- throw new RuntimeException("序列化对象(" + obj + ")!");
- }
- //主题,只要实现了一个主题就可以被序列化和反序列化
- Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(obj.getClass());
- LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
- byte[] protostuff = null;
- try {
- protostuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
- } catch (Exception e) {
- throw new RuntimeException("序列化(" + obj.getClass() + ")对象(" + obj + ")发生异常!", e);
- } finally {
- buffer.clear();
- }
- return protostuff;
- }
- public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) {
- if (paramArrayOfByte == null || paramArrayOfByte.length == 0) {
- throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
- }
- T instance = null;
- try {
- instance = targetClass.newInstance();
- } catch (IllegalAccessException e) {
- throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e);
- } catch (InstantiationException e) {
- e.printStackTrace();
- }
- Schema<T> schema = RuntimeSchema.getSchema(targetClass);
- ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema);
- return instance;
- }
- }
使用起来就是这么简单.
最后献上管网地址一枚:http://www.protostuff.io/
老王讲自制RPC框架.(四.序列化与反序列化)的更多相关文章
- 老王讲自制RPC框架.(一.前言与技术选型)
(#)背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只 ...
- 老王讲自制RPC框架.(三.ZOOKEEPER)
(#)定义Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配 ...
- 老王讲自制RPC框架.(二.动态代理)
(#简介) 什么是动态代理?动态代理是实现阶段不关心代理是谁,而在运行阶段才指定代理对象是哪一个,动态代理在做框架方面使用非常 广泛,比如spring的aop,其核心就是采用动态代理机制,下面让我们来 ...
- 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架
目录 一.前言 二.RPC 基础概念 1. RPC 是什么? 2. 需要解决什么问题? 3. 有哪些开源实现? 三.protobuf 基本使用 1. 基本知识 2. 使用步骤 四.libevent 1 ...
- RPC 框架
RPC 谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol) RPC就是要像调用本地的函数一样去调远程函数. 推荐 ...
- RPC框架-通俗易懂的解释
早期单机时代,一台电脑上运行多个进程,大家各干各的,老死不相往来.假如A进程需要一个画图的功能,B进程也需要一个画图的功能,程序员就必须为两个进程都写一个画图的功能.这不是整人么?于是就出现了IPC( ...
- python之路:变量与变量基本操作(老王版)
python开发之路:变量与变量基本操作 你是一个师范大学的优秀毕业生,现在在某某小学工作. 你想:判作业真的很累,隔壁老王现在天天玩<蓝月传奇>,银行里存满了钱.唉,每节课1个小时,每个 ...
- RPC框架从0到10
RPC(Remote Procedure Call) 从单机走向分布式,产生了很多分布式的通信方式 最古老也是最有效,并且永不过时的,TCP/UDP的二进制传输,事实上所有的通信方式归根结底都是TCP ...
- C#中的序列化与反序列化
眼看XX鸟的课程关于C#的知识点就要学完了,翻看网络中流传的教程还是发现了一个课程中没有讲到的知识点:序列化与反序列化 无奈还是了解一下并操作一番,以备后用吧 介绍:就是将对象信息转化为二进制信息以便 ...
随机推荐
- ubuntu配置NFS
ubuntu配置NFS: sudo apt-get install nfs-kernel-server 配置/etc/exports 例如:我们要将根目录下的 /opt/FriendlyARM/min ...
- 在虚拟机中配置FastDFS+Nginx模块
先上部署图 提示一下, ip 192.168.72.138 上面部署了两个group, 分别为 group1和g2. 另外, 同组之内的 port 要保持一致. 一.安装准备 1. #每台机器都添加两 ...
- Swift
1.Swift项目与OC项目的区别 - Swift的类文件是以 .swift 结尾 - main.m 不见了,程序入口以 `@UIApplicationMain` - Swift中,代码都是写到 `{ ...
- C#动态生成html页
Html生成模块:WriteHtml.cs using System.Collections.Generic; using System.IO; using System.Text; namespac ...
- MongoDB - 在Windows上安装
1 下载MongoDB社区版, 下载链接 http://www.mongodb.org/downloads?_ga=1.129742796.1997610832.1481940266 2 安装Mong ...
- HTTP请求 GET与POST是怎么实现?
1.HTTP请求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP请求中, ...
- symfony安装笔记
下载http://symfony.com/download,这里版本是2.8 将D:\ApacheServer\php路径添加到环境变量path中,在cmd命令行中可以执行php命令 打开php.in ...
- IE兼容性的注意点
IE会将注释节点实现为元素,所以在IE中调用getElementsByTagName里面会包含注释节点,这个通常是不应该的 getElementById的参数在IE8及较低的版本不区分大小写 IE7及 ...
- poj 2774
传送门:http://poj.org/problem?id=2774 裸的后缀数组,我只是为了贴个版而已 代码 #include <cstdio> #include <cmath&g ...
- 一个ubuntu phper的自我修养(workbench)
workbench从此和navicat的激活码说再见 workbench是一个免费易用功能强大的mysql图形化管理软件,navicat上用到的功能,workbench上都能找到. 一.workben ...