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

序列化与反序列化之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());       } }

iPhone14系列新品手机泰国起价约6300元9月16日开售9月8日苹果召开了新品发布会,并公布了包括手机手表耳机在内的苹果系列最新产品,在这场发布会上,备受期待的莫过于iPhone14系列手机产品,许多泰国的果迷也在蠢蠢欲动。根据苹果(泰小心婚姻新型骗局洗房,遇到这种情况需要慎重考虑洗房就是指结婚后,夫妻中的一方通过威胁欺骗(如婚后不想生孩子是否是学区房交通不便利)等方式让另一方把婚前已经购买的房产卖出去,再重新购买一套婚后房子,将原先的婚前财产变为婚后双方的那英李湘送女去国外贵族学校!王诗龄住公主房间,一身行头5万又到开学季,很多留学生都已飞回加拿大上学。明星的子女们也不例外,最近,有网友在英国偶遇那英带着孩子逛街,和明星梁静一起看歌剧。李湘更是直接晒出了女儿入读英国贵族学校的照片,看起来,ampampquot背景成谜ampampquot景甜住3亿豪宅,弃金主痴恋张继科,因虚假代言被罚唐嫣穿冒牌高定被啪啪打脸景甜直接豪掷500万让品牌方叫爸爸2011年景甜因咖位不够向ElieSaab品牌借礼服被拒于是怒火中烧的她直接大手一挥斥资500万购入该款礼服事后景甜接受采蓝绿互打政二代,港媒预言第三方势力将成最后赢家来源台海网台海网9月8日讯据香港中评社报道,台北市长选举最近一波攻势,聚焦在蓝绿互打政二代的议题上,蓝营拿出民进党台北市长候选人陈时中竞选团队政二代名单,绿营不甘示弱回呛中国国民党半年报揭秘比亚迪单车毛利超3万,但依旧是上游的打工仔?今年上半年,在疫情反复国际形势复杂的大环境下,我国汽车行业面临着供给冲击需求收缩预期转弱三重压力,整体销量同比下滑了6。6。但新能源汽车依旧高歌猛进,产销均同比增长1。2倍。面对复海底捞光锅底料碗就上百元!回应称门店因成本等影响不定期调整价格,网友我一般点三个清水锅中国经济周刊经济网讯近日,一名陕西西安的网友吐槽自己真要被海底捞的价格劝退了。该网友称,自己在海底捞就餐,光锅底费加上料碗和饮料,还没吃160元就没了,四个人吃了700多元。对此,台媒绿色集团玻璃心,笑死,无能民进党当局民进党当局内政部脸书日前发文宣传破获诈骗集团的政绩,并教大家一个破解之道,就是碰到诈骗事件时直接大声说笑死!内政部列出的笑死例句包括笑死,竟然有人说ATM可以解除分期付款笑死,竟然辛巴辛有志的壹辛壹意公益计划出炉这对夫妻有爱有情还有正能量近日,辛巴辛有志在上海为粉丝免费举办专场演唱会。此次演唱会不仅邀请了胡彦斌张碧晨L4WUDU吴亦凡张信哲邓紫棋等实力唱将前来助阵,更是邀请了著名音乐人海泉担任此次演唱会主持人,阵容今日治愈系文案摘抄1你是完整的自己,是他人的生活碎片。2把计划本上的每一件事都打钩,是循序渐进,踏踏实实,全力以赴。3想成为一个永远热爱生活,永远期待明天的普通人。4生活给的每一份温柔都要小心收藏,隐藏在南部山区的这些山水秘境,让你不出济南,领略大好河山上一篇给大家攻略了济南南部山区的景区,还有一些私藏宝藏,全是免费的,有山有水,风景不输景区,号称小桂林小漓江小九寨不出济南,领略祖国大好河山的缩小版,周末休闲遛娃超赞!01玉水画廊
过年大欢乐,延安信天游唱响无锡西高山观美景品美食赏非遗看表演。。1月13日,2023年延风锡韵民俗文化活动周在无锡市惠山区拉开帷幕。作为喜迎新春共度佳节的一场热闹市集,主办方通过开展丰富多彩形式新颖的活动,宣传展示延年味渐浓,新宁崀山景区推出系列优惠大礼包来源华声在线华声在线1月12日讯(见习记者曾冠霖实习生宋科铖通讯员颜克明蒋世民)1月12日,崀山北大门年味渐浓,景区在实施春节假期门票半价优惠的基础上,又推出了新春祈福抖音拜年和继中国最美乡村婺源熹园景区,有一座美丽舒适的熹园宾舍2016年8月30日31日有幸入住熹园宾舍,在熹园宾舍度过了两天美好的时光,熹园宾舍位于中国最美乡村婺源熹园景区内,地处星江河畔,面水依山,古树掩映。园内以两个水池为核心,依次有尊天河筑梦,超级水网造福亿万人国有企业是中国特色社会主义的重要物质基础和政治基础,是国民经济的压舱石。2022年12月28日起,由中央广播电视总台与国务院国资委联合制作的系列纪录片大国基石,在央视综合频道黄金时人生,没有下辈子,珍惜今生,不管来生,才不负人生,不负身边人人生,没有下辈子,珍惜今生,不管来生,才不负人生,不负爱人人生路,只有一条单行道,只能往前走,没有回头的路。走一程短一程,过一天少一天,很快到终点。人生就是这么短暂,没有谁为我们的飘逸声带今生相爱灵动一曲实若天籁分享视频歌手泽尔丹扎西措今生相爱httpsc。y。qq。combasefcgibinu?nwLVmW48nAOGQQ音乐君送挚爱,隆起连绵山脉。陪我走哉,如飞茫茫云海。真心攒下,深晨意帮忙丨书信断了思念没断!湖南77岁老人寻找50多年前老友年纪越大越想他们这么久的时间,你们都在哪里?过得还好吗?如果能找到50多年前的两位好友,刘毅雄最想说出这句话。1970年,大学毕业的刘毅雄被分到广东怀集县参加工作,在此期间认识了两位同年毕业的山西从河北农村走出来的6位明星,没背景没资源,各个让人心酸流泪文体娱有话编辑体娱有话前言在娱乐圈这个卧虎藏龙的地方,蕴藏了很多来自农村的普通家庭的孩子。从零开始苦出身,没有资源和人脉,一步步走到成功。今天小编就带大家来了解下这6位来自河北农村家里两个孩发生争执时该如何教育七岁的哥哥和四岁的弟弟家里有两个孩子在年龄差的不多的,经常爱吵架,这个纯属正常。你会发现家里有两个孩子的老二,往往比老大要聪明和智慧,要成长的快。老大一般都是憨厚老实,因为老大都是小儿氨酚黄那敏颗粒和布洛芬能一起给孩子吃吗?在日常生活中,孩子感冒发烧了,好多家长都是将小儿氨酚黄那敏颗粒和布洛芬这两个药一起给孩子服用,他们觉得布洛芬是退烧的,小儿氨酚黄那敏颗粒是治疗感冒的。其实,这样做是大错特错的。小儿睡前半小时,陪伴孩子做到这2件事,孩子不知不觉变优秀孩子越来越优秀,都是从小事开始养育一个孩子是很辛苦的,但其实也有很多空间可以提升,比如说每天做好睡前半小时的这段时间,孩子不知不觉就可以养成很多好习惯,变得越来越优秀。多妈妈有话说