范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

序列化与反序列化之Protostuff(一)

  一 序列化与反序列化
  在大型开发中,序列化与反序列化是一个常见的技术点和问题。在之前我们对序列化与反序列化有过相关描述,但并不系统,更偏重于原理介绍。这里,我们将详细介绍序列化与反序列化的更多场景和应用实践。
  序列化-protobuf的编码结构二 概念回顾
  当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
  把Java对象转换为字节序列的过程称为  对象的序列化  。
  把字节序列恢复为Java对象的过程称为  对象的反序列化  。   三技术方案3.1google的protobuffer
  早期google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,过程较为繁琐。不过目前随着protobuf-java等jar包的提供,使用也简化了很多。github地址:https://github.com/topics/protobuffer。   3.2Java的序列化与反序列化
  根据Thinking in java 3rd Edition的描述:
  利用对象序列化可以实现"轻量级持久化"(lightweight persistence)。"持久化"意味着一个对象的生存周期并不取决于程序是否正在执行;它可以生存于程序的调用之间。通过将一个序列化对象写入磁盘,然后在重新调用时恢复该对象,就能够实现持久化的效果。之所以称其为"轻量级",是因为不能用某种"persistent"(持久)关键字来简单地定义一个对象,并让系统自动维护其他细节问题(尽管将来有可能实现)。相反,对象必须在程序中显式地序列化和重组。如果需要一个更严格的持久化机制,可以考虑使用Java数据对象(JDO)或者像Hibernate之类的工具。
  对象序列化的概念加入到语言中是为了提供对两种主要特性的支持:
  ·Java的"远程方法调用"(RMI,Remote Method Invocation)使存活于其他计算机上的对象使用起来就像是存活于本机上一样。当向远程对象发送消息时,需要通过对象序列化来传输参数和返回值。
  ·对Java Beans来说对象序列化也是必需的。使用一个Bean时,一般情况下是在设计阶段对它的状态信息进行配置。这种状态信息必须保存下来,并在程序启动以后,进行恢复;具体工作由对象序列化完成。   3.3io.protostuff
  这是最近在项目中使用到的一个框架,本篇也将先详细描述相关的使用案例,作为本系列的开篇。   四使用示例4.1引入maven依赖
  使用的是1.5.3版本:        io.protostuff     protostuff-runtime     1.5.3       io.protostuff     protostuff-core     1.5.3 4.2定义实体类4.2.1ProtoBufEntitypackage com.flamingskys.toolbox.tool.protobuf.entity;   import lombok.Data;   @Data public class ProtoBufEntity {     private String name;     private int age;     private String label;       public ProtoBufEntity(){       }       public ProtoBufEntity(String name, Integer age){         this.name = name;         this.age = age;     } }4.2.2GroupEntity
  这是一个嵌套实体类,包含了上面的ProtoBufEntity:   package com.flamingskys.toolbox.tool.protobuf.entity;   import lombok.Data; import java.util.List;   @Data public class GroupEntity {     private String id;       private String name;       private List entities;       public GroupEntity(String id, String name, List entities) {         this.id = id;         this.name = name;         this.entities = entities;     } }4.2.3应用类ProtoStuffUtilspackage com.flamingskys.toolbox.tool.protobuf;   import com.flamingskys.toolbox.tool.protobuf.entity.GroupEntity; import com.flamingskys.toolbox.tool.protobuf.entity.ProtoBufEntity; import io.protostuff.LinkedBuffer; import io.protostuff.ProtostuffIOUtil; import io.protostuff.Schema; import io.protostuff.runtime.RuntimeSchema;   import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;   public class ProtoStuffUtils {     /**      * 避免每次序列化都重新申请Buffer空间      */     private static LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);     /**      * 缓存Schema      */     private static Map, Schema<?>> schemaCache = new ConcurrentHashMap, Schema<?>>();       /**      * 序列化方法,把指定对象序列化成字节数组      *      * @param obj      * @param       * @return      */     @SuppressWarnings("unchecked")     public static  byte[] serialize(T obj) {         Class clazz = (Class) obj.getClass();         Schema schema = getSchema(clazz);         byte[] data;         try {             data = ProtostuffIOUtil.toByteArray(obj, schema, buffer);         } finally {             buffer.clear();         }           return data;     }       /**      * 反序列化方法,将字节数组反序列化成指定Class类型      *      * @param data      * @param clazz      * @param       * @return      */     public static  T deserialize(byte[] data, Class clazz) {         Schema schema = getSchema(clazz);         T obj = schema.newMessage();         ProtostuffIOUtil.mergeFrom(data, obj, schema);         return obj;     }       @SuppressWarnings("unchecked")     private static  Schema getSchema(Class clazz) {         Schema schema = (Schema) schemaCache.get(clazz);         if (schema == null) {             //这个schema通过RuntimeSchema进行懒创建并缓存             //所以可以一直调用RuntimeSchema.getSchema(),这个方法是线程安全的             schema = RuntimeSchema.getSchema(clazz);             if (schema == null) {                 schemaCache.put(clazz, schema);             }         }           return schema;     }       public static void main(String[] args){         final ProtoBufEntity entity1 = new ProtoBufEntity("aaa",20);         final ProtoBufEntity entity2 = new ProtoBufEntity("bbb",21);         List entitys = new ArrayList(){             {                 add(entity1);                 add(entity2);             }         };         GroupEntity group = new GroupEntity("id_1","group1", entitys);           byte[] bytes = ProtoStuffUtils.serialize(group);         System.out.println("序列化后: " + bytes.length);           GroupEntity group1 = ProtoStuffUtils.deserialize(bytes,GroupEntity.class);         System.out.println("反序列化后: " + group1.getName());       } }

贝克汉姆长子婚礼晒全家福,小七从小被大哥宠到大,和新嫂成闺蜜对于布鲁克林和妮可拉的婚礼举行圆满的成功也表示祝贺,最近难得的大喜事,贝克汉姆的长子结婚,刚好是适婚年龄,如今的布鲁克林23岁结婚后也会接受老丈人旗下的事业,所以先成家后立业,显然这球没法踢了!青岛队愤然退出中甲联赛,并痛斥足协两大罪状中国足球现在烂到无可救药了,远的不说,就拿今年来说,正月初一惨败给越南后,人们愤怒到了极点,什么海参天价年薪等被人一一列出,争议不断。新帅李霄鹏带领的的国家队在12强赛最后2场比赛76人首轮对阵猛龙,大家更看好谁?猛龙的锋线群机动性很强,76人的射手在一般情况下很难发挥,所以需要恩比德和哈登起码一个打爆对面的一对一防守,记住是要打爆,予取予求那样的,要不然全都一对一单防,很难在系列赛过掉猛龙希丁克谈2002韩意战赛前韩总统打电话,承诺赢意大利就免兵役直播吧4月14日讯日前,FIFA官方平台上线2002年世界杯纪录片2002ThisisanAsianOdyssey(2002一部亚洲的奥德赛),时任韩国主帅的希丁克在片中采访透露,又肘击!第一场就伤人!真是CBA头号恶汉听到超级大杀器许钟豪会在对阵上海队解禁复出后,按他专干国字号后卫的属性,众人都替郭昊文和李添荣捏了一把汗。两位冲击力十足的新星若倒下,系列赛可能会因此失衡,广厦队或许完全占据上风!正式官宣!中国女排20人名单出炉,王梦洁已落选,缪伊雯已是黑马就在今天,中国女排集训名单终于官宣了,和之前网传的20人名单没有任何出入,王云蕗金烨皆是入选,王梦洁则是落选,缪伊雯则是真正成为了中国女排的一匹黑马,而吴梦洁王逸凡这样的新人也成功一觉醒来,5大斯诺克冠军出局!4冠王被KO,多特饮恨,3将被爆冷经过10天鏖战,斯诺克世锦赛资格赛终于落幕。一觉醒来,5大斯诺克冠军出局,世界冠军147先生多特连追4局仍落败,手握1座排名赛冠军的汉密尔顿米尔金斯和吉米罗伯逊倒在正赛门口,排名赛衰老加速的祸根被找到,3种习惯榜上有名,尽早改正还来得及当女性的肌肤上长出皱纹之后,用再好的护肤品也无法解决受损的肌肤。女性肌肤的好坏和自己的日常生活习惯密不可分,如果不注重肌肤的护理,就会让肌肤老得越来越快。爱美的女生从年轻时就开始寻千年治汗第一方!治出汗不止,气虚自汗,阴虚盗汗,效果非常好1hr气虚自汗,阴虚盗汗,多汗在生活中算是一种常见病,大多数人并不在意。中医学认为,汗为心之液。如果出汗太多或者是自汗盗汗时间过久,就会伤津耗神,从而出现精神倦怠脸色苍白四肢乏力不3种常见的护肤方式,让你的皮肤越来越差1。博主说的都对,博主推荐的产品都买买买我发现,不少人护肤方式都是由他们所信任的博主决定的。我们经常跟大家科普,面膜不能天天敷没有能深层补水的产品口服胶原蛋白不能补到脸上但是一看种皮肤院院士提醒睡前一个好习惯,若坚持,肤嫩光滑,气色佳女性一到中年,除了各项身体机能开始下滑之外,肌肤中的胶原蛋白活性也开始逐渐流失。一项数据统计显示,一般女性在30岁之后,肌肤胶原蛋白的流失率可达35以上,是导致皮肤变老的主要祸根。
大梦两年后,京东京喜宣告解散,京东下沉梦告一段落在今年七月的的京东会议上,刘强东亲自承认了京喜项目的失败。两年前的2020年12月,本号曾经发表一篇关于京东下沉项目京喜的文章。没想到短短两年后,京喜作为下沉市场打造的一级事业群,7000mAh电池512G内存,三星GalaxyF62蓄势待发,真香预定可能大家都发现了,三星这个大品牌以高端旗舰的布局为主,在中低端市场上品类很少,正是因为如此,小米OV荣耀等发力中低端市场,用很多千元机或者中端机从三星那里抢走了很多用户,这就是为什专访高能数造王世明3D打印为下一代电池提供制造新途径3D打印电池产业未来将是动力电池行业的下一个风口,但目前也面临着非常大的挑战。谁能真正实现3D打印电池批量化生产,完成商业化布局,谁就能在全球电池企业市场头部占有一席之地。高能数造汽车行业专题研究汽车总量研究及周期复盘(报告出品方作者方正证券,段迎晟)1短周期景气上行近期表现原材料价格上游原材料价格小幅回落,汽车板块基本面迎来确定性复苏。2020年起受疫情影响,钢材橡胶铝等核心原材料在价格上均有骁龙695天玑8105000mAh电池,三款性价比不低的千元机如今1000元以内的手机基本都很难用,除了性能很弱以外,内存普遍都低于6GB,联想到安卓软件普遍比较臃肿,这样的手机稍微多开几个应用就会出现杀后台的情况,体验不太好。所以我们就把预夜读你在彼岸,我在此岸你在彼岸,我在此岸文李宁不是天女散花。仿佛一夜之间几片树叶抱团落下恍恍惚惚,已是秋天而这个秋天却姗姗来迟天使白像蝴蝶中国红像火焰在大街小巷,成为一道道亮丽的风景线目不暇接白色的耀眼果酸换肤,可以去除老化角质,但也有一定风险果酸焕肤,简而言之,就是拿果酸来换肤的意思。使用高浓度的果酸进行皮肤角质的剥离作用,促使老化角质层脱落,加速角质细胞及少部分上层表皮细胞的更新速度。促进真皮层内弹性纤维增生,对浅层常吃辣椒上火又便秘?研究发现吃辣降低死亡风险,不敢吃的人看看辣椒,听到它的名字就已经感觉嘴巴冒火了,别看现在大街小巷到处都是川菜馆,但其实辣椒刚传入我国时,百姓们压根吃不了辣椒。这红彤彤火辣辣的食物,吃了浑身冒汗,嘴巴像着火一样,到底是个啥0919龙头涨停连板股晋级展望大盘下跌原因与猜想0916当天收盘,沪指跌2。3,深成指跌2。3,创业板指跌2。34。沪深两市成交额7994亿,较上个交易日缩量1197亿。A股全线下跌,股票下跌数超4100只,东方财富跌超10,券黄金今天价格走势分析,黄金白银操作指南原油解套在线黄金最新行情走势分析周五(9月16日)现货黄金时隔一周再度走弱,且跌势加速,破位并创下2020年4月上旬以来新低至1654。06美元盎司。这主要缘于美国8月通胀数据高于预期,美联储关注未来两年锂产品供应或大幅增长,工信部推动锂资源保供稳价文懂车帝原创刘艺伟懂车帝原创行业日前,据工信部官网消息,为促进锂资源产业平稳健康发展,保障新能源汽车等产业链供应链安全稳定,9月15日,工业和信息化部原材料工业司组织召开锂资源产业