unity3d,答题系统 unity3d,答题系统 unity3d,答题系统 unity3d,答题系统。

文件:590m.com/f/25127180-500693780-6d2cad(访问密码:551685)

以下内容无关:

-------------------------------------------分割线---------------------------------------------

接着我们需要定义一份BasicUsage.proto的描述文件,其结构和我们定义普通的类十分类似。特别需要注意的是,字段后跟着的=号不代表字段的值,而是字段的序号,后面会详细解释

syntax = “proto3”;

option java_package = “cn.tera.protobuf.model”;
option java_outer_classname = “BasicUsage”;

message Person {
string name = 1;
int32 id = 2;
string email = 3;
}
第一行表示所使用的的语法版本,这里选择的是最新的proto3版本。

syntax = “proto3”;
第三、四行表示最终生成的java的package名和class的类名

option java_package = “cn.tera.protobuf.model”;
option java_outer_classname = “BasicUsage”;
有了编译器和.poto描述文件,我们就可以生成java模型文件了

-I :表示工作目录,如果不指定,则就是当前目录

–java_out:表示输出.java文件的目录

protoc -I=/protocol_buffer/protobuf/proto --java_out=/protocol_buffer/protobuf/src/main/java/ /protocol_buffer/protobuf/proto/BasicUsage.proto
以上都是准备工作,接着我们就要进入代码相关部分

引入maven依赖

com.google.protobuf protobuf-java 3.9.1 com.google.protobuf protobuf-java-util 3.9.1 接下去创建一个简单的测试用例

/**

  • protobuf的基础使用
    */
    @Test
    void basicUse() {
    //创建一个Person对象
    BasicUsage.Person person = BasicUsage.Person.newBuilder()
    .setId(5)
    .setName(“tera”)
    .setEmail(“tera@google.com”)
    .build();
    System.out.println("Person’s name is " + person.getName());

    //编码
    //此时我们就可以通过我们想要的方式传递该byte数组了
    byte[] bytes = person.toByteArray();

    //将编码重新转换回Person对象
    BasicUsage.Person clone = null;
    try {
    //解码
    clone = BasicUsage.Person.parseFrom(bytes);
    System.out.println(“The clone’s name is " + clone.getName());
    } catch (InvalidProtocolBufferException e) {
    }
    //引用是不同的
    System.out.println(”==:" + (person == clone));
    //equals方法经过了重写,所以equals是相同的
    System.out.println(“equals:” + person.equals(clone));

    //修改clone中的值
    clone = clone.toBuilder().setName(“clone”).build();
    System.out.println("The clone’s new name is " + clone.getName());
    }
    3.protobuf的特性
    A.之前有提到protobuf编码后的字节大小要小于json格式,因此做一个简单的对比,json结果60字节,而protobuf是37个字节。

/**

  • json和protobuf的编码数据大小
    */
    @Test
    void codeSizeJsonVsProtobuf() throws Exception {
    //构造简单的java模型
    PersonJson model = new PersonJson();
    model.email = “personJson@google.com”;
    model.id = 1;
    model.name = “personJson”;
    String json = JSON.toJSONString(model);
    System.out.println(“原始json”);
    System.out.println("------------------------");
    System.out.println(json);
    System.out.println(“json编码后的字节数:” + json.getBytes(“utf-8”).length + “\n”);

    //parser
    JsonFormat.Parser parser = JsonFormat.parser();
    //需要build才能转换
    BasicUsage.Person.Builder personBuilder = BasicUsage.Person.newBuilder();
    //将json字符串转换成protobuf模型,并打印
    parser.merge(json, personBuilder);
    BasicUsage.Person person = personBuilder.build();
    //需要注意的是,protobuf的toString方法并不会自动转换成json,而是以更简单的方式呈现,所以一般没法直接用
    System.out.println(“protobuf内容”);
    System.out.println("------------------------");
    System.out.println(person.toString());
    System.out.println(“protobuf编码后的字节数:” + person.toByteArray().length);
    }
    B.protobuf是一个不可完全自解析的编码格式,也就是说,如果没有任何其他资料的支持(例如模型的定义文件、.proto文件等)仅仅拿到编码后的结果字节,是无法还原出原始的数据的,也很难人工阅读。

C.通过google官网提供的编译器生成的.java类文件的大小十分惊人,例如本文之前的一个简单的类定义,就会生成32kb的.java文件。在实际项目中,遇到过1mb左右的.java文件。

D.protobuf的编码和解码速度都优于json

4.protobuf的编码原理
针对上面4个主要的特性,我们来了解一下protobuf的基本编码原理,从而理解导致上述4个特性的原因。

A.数字编码Varint、数据长度与数据编号

平时我们对数字的编码其实并不会有特别的约定,一个字节本身就能表示0~255的数字(这里假定是无符号的)。然而当我们在网络上传递编码成字节的数据时,由于网络传输半包、粘包等等各种因素的存在,如何确定整个数据的长度就是最首要的任务。

因为数据大小的不确定性,我们无法约定固定的字节表示数据长度。例如有时候数据量小于255个字节,那么一个字节就能表示长度,若超过了65535,那么就需要3个字节才能表示数据长度了。

为了解决这个问题,采用了varint编码方式。它约定,每个表示数字字节的最高位若为1,则说明该数字还需要读取下一个字节。若字节的最高位位0,则表示数字的字节读取完毕。而剩下的7位则记录具体的数字。

unity3d答题系统相关推荐

  1. 【Unity3D应用案例系列】答题系统开发

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 这是本专栏系列的第一篇,答题系统的开发. 这个答题系统,可以从文本 ...

  2. Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

    前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...

  3. php实现直播答题系统,直播答题解决方案

    概述 即构提供直播答题一站式解决方案,包括 Windows 主播端.移动 APP 端示例源代码(iOS.Android). 1 下载/体验地址 由于直播答题场景需要主播端(推流.发题)和观众端(拉流. ...

  4. php简单选择题,念做个简易php选择题答题系统

    想做个简易php选择题答题系统 想做个简易的答题系统,遇到点困难,就是提交不了,请大家帮帮忙,谢谢~! 问答 1.6匹马拉着一架大车跑了6公里,6匹马一共跑了多少公里? A.6  &nbsp ...

  5. 小程序项目:基于微信小程序的答题系统——计算机毕业设计

    运行环境 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/ ...

  6. Unity3D 光照系统(一)

    此系列博客是博主个人学习Unity3D的一些笔记,欢迎转载,如有错误,欢迎指出~~(基于unity3d 5.4.0f3) 光照系统 unity3D光照系统Lighting菜单中,一共有6个选项,分别为 ...

  7. 【无标题】C语言编写一个简单答题系统

    这是蒟蒻写的第一个博客,将就看看吧! 首先,我写的是一个填空题答题系统,填空题数目为20. 其次,需要随机出题,题目出现顺序要不一致. (1) 产生随机数 1~20 (2)  解决运气不好的问题1-1 ...

  8. c语言编写一个简单的答题系统

    利用c语言编写一个简单的答题系统. 思路是先设计好题目和答案,再输入自己的答案,利用输入的答案与正确答案对比,从而得出你回答的对错. (一)捆绑题目和答案 我们可以利用结构体对一个题目捆绑上一个答案. ...

  9. 用C语言编写一个“简单”的程序答题系统

    上个星期我们老师给我们布置一道他认为很简单的题,其实就想考考我们,要我们写一个简单的答题系统.开始一看只有一道题我直呼:"仰天大笑出门去,我辈岂是蓬蒿人" 以为老师放我一马,结果点 ...

最新文章

  1. 在IT技术圈混,怎么能不知道这几个公众号
  2. Python Open Source Project List
  3. 运营商助力新型智慧城市建设
  4. PB中如何调用shellExecute
  5. 你复工了吗?啥感受?
  6. 密封槽设计标准_哈尔滨轴承 | 超全面机械密封选型
  7. 6.17 dokcer(一)Compose 简介
  8. mysql 索引及索引创建原则
  9. Replace Parameter with Explicit Methods(以明确函数取代参数)
  10. VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator
  11. 抖音上非常火的整人小程序
  12. 用旧电脑安装黑群晖系统
  13. 错误: 找不到符号 符号: 类 ActivityMainBindingImpl
  14. simulink仿真之阶梯步长
  15. 炸了~Redis bigkey导致生产事故-bigkey问题全面分析
  16. 相控阵雷达防治野猪引热议!仅重15kg,可同时监控100个目标,网友:已经这么白菜化了?...
  17. 巧妙设置QQ密码 气死嚣张木马(转)
  18. 按下鼠标滚轮c语言,C++检测鼠标某键是否按下
  19. 【算法设计与分析】贪心算法:单源最短路径和prim算法的最小生成树
  20. IO流(输入流与输出流)

热门文章

  1. 秉火429笔记之九 中断应用概述
  2. python学习笔记---中文词云
  3. 亲测:一加手机3刷机OxygenOS详细教程
  4. P3386 【模板】二分图最大匹配
  5. PythonGUI 使用Tkinter写一个简单时间间隔计算器
  6. 未来音乐战场:从「听音乐」到「用音乐」
  7. 刷题回顾(持续更新)
  8. 流程发现算法第1讲| Alpha算法
  9. 使用github+Hexo人人都能拥有一个美美的博客
  10. 解决专利侵权的另一个想法:消除陪审团审判