unity3d答题系统
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答题系统相关推荐
- 【Unity3D应用案例系列】答题系统开发
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 这是本专栏系列的第一篇,答题系统的开发. 这个答题系统,可以从文本 ...
- Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇
前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...
- php实现直播答题系统,直播答题解决方案
概述 即构提供直播答题一站式解决方案,包括 Windows 主播端.移动 APP 端示例源代码(iOS.Android). 1 下载/体验地址 由于直播答题场景需要主播端(推流.发题)和观众端(拉流. ...
- php简单选择题,念做个简易php选择题答题系统
想做个简易php选择题答题系统 想做个简易的答题系统,遇到点困难,就是提交不了,请大家帮帮忙,谢谢~! 问答 1.6匹马拉着一架大车跑了6公里,6匹马一共跑了多少公里? A.6   ...
- 小程序项目:基于微信小程序的答题系统——计算机毕业设计
运行环境 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/ ...
- Unity3D 光照系统(一)
此系列博客是博主个人学习Unity3D的一些笔记,欢迎转载,如有错误,欢迎指出~~(基于unity3d 5.4.0f3) 光照系统 unity3D光照系统Lighting菜单中,一共有6个选项,分别为 ...
- 【无标题】C语言编写一个简单答题系统
这是蒟蒻写的第一个博客,将就看看吧! 首先,我写的是一个填空题答题系统,填空题数目为20. 其次,需要随机出题,题目出现顺序要不一致. (1) 产生随机数 1~20 (2) 解决运气不好的问题1-1 ...
- c语言编写一个简单的答题系统
利用c语言编写一个简单的答题系统. 思路是先设计好题目和答案,再输入自己的答案,利用输入的答案与正确答案对比,从而得出你回答的对错. (一)捆绑题目和答案 我们可以利用结构体对一个题目捆绑上一个答案. ...
- 用C语言编写一个“简单”的程序答题系统
上个星期我们老师给我们布置一道他认为很简单的题,其实就想考考我们,要我们写一个简单的答题系统.开始一看只有一道题我直呼:"仰天大笑出门去,我辈岂是蓬蒿人" 以为老师放我一马,结果点 ...
最新文章
- 在IT技术圈混,怎么能不知道这几个公众号
- Python Open Source Project List
- 运营商助力新型智慧城市建设
- PB中如何调用shellExecute
- 你复工了吗?啥感受?
- 密封槽设计标准_哈尔滨轴承 | 超全面机械密封选型
- 6.17 dokcer(一)Compose 简介
- mysql 索引及索引创建原则
- Replace Parameter with Explicit Methods(以明确函数取代参数)
- VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator
- 抖音上非常火的整人小程序
- 用旧电脑安装黑群晖系统
- 错误: 找不到符号 符号: 类 ActivityMainBindingImpl
- simulink仿真之阶梯步长
- 炸了~Redis bigkey导致生产事故-bigkey问题全面分析
- 相控阵雷达防治野猪引热议!仅重15kg,可同时监控100个目标,网友:已经这么白菜化了?...
- 巧妙设置QQ密码 气死嚣张木马(转)
- 按下鼠标滚轮c语言,C++检测鼠标某键是否按下
- 【算法设计与分析】贪心算法:单源最短路径和prim算法的最小生成树
- IO流(输入流与输出流)