首页 > 其他分享 >protobuf使用(二)android ndk

protobuf使用(二)android ndk

时间:2023-02-28 16:31:35浏览次数:29  
标签:XML ndk 数据结构 Protobuf person set android 序列化 protobuf


简介

 

1.   官方文档中提到一些protobuf的优点, protobuf灵活高效的结构化数据存储格式.方便用于序列化, 适合做RPC的数据交换.

2.   相比 XML , protobuf 比 XML 更小、更快、更简单.仅需要写一个 *.proto 文件描述需要的数据结构, protobuf会帮助你实现相关类和方法(自动化多好!).

3.   目前提供 C++, Java, Python, Go, C#等多种语言 的API
 

Protobuf 的优点

Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。

它有一个非常棒的特性,即“向后”兼容性好,人们不必破坏已部署的、依靠“老”数据格式的程序就可以对数据结构进行升级。这样您的程序就可以不必担心因为消息结构的改变而造成的大规模的代码重构或者迁移的问题。因为添加新的消息中的 field 并不会引起已经发布的程序的任何改变。

Protobuf 语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。

使用 Protobuf 无需学习复杂的文档对象模型,Protobuf 的编程模式比较友好,简单易学,同时它拥有良好的文档和示例,对于喜欢简单事物的人们而言,Protobuf 比其他的技术更加有吸引力。

Protobuf 的不足

Protbuf 与 XML 相比也有不足之处。它功能简单,无法用来表示复杂的概念。

XML 已经成为多种行业标准的编写工具,Protobuf 只是 Google 公司内部使用的工具,在通用性上还差很多。

由于文本并不适合用来描述数据结构,所以 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。另外,由于 XML 具有某种程度上的自解释性,它可以被人直接读取编辑,在这一点上 Protobuf 不行,它以二进制的方式存储,除非你有 .proto 定义,否则你没法直接读出 Protobuf 的任何内容

Protobuf 简单使用

简单的person.proto文件:

syntax = "proto3";
package tutorial;

message Person {
int32 id = 1;
string name = 2;
string email = 3;
}

使用这个和文件和下载的工具可以写成代码,生成C++ 批处理工具 person.bat

protoc --cpp_out=./ person.proto

上面的 cpp 换成 java 就可以成生 java 代码。这个生成的类似 java bean 类。支持序列化

下 面看一下简单使用

#include "person.pb.h"

// 赋值
tutorial::Person person ;
person.set_name("testname");
person.set_id(120);
person.set_email("[email protected]");
//序列化 变字节,就可以传递了
int blen = person.ByteSize();
uint8_t *buf = new uint8_t[blen+1];
memset(buf,0,blen+1);
int serRet = person.SerializeToArray(buf, blen);

//反序列化 ,就可以直接得到数据
tutorial::Person nPerson ;
int parseRet = nPerson.ParseFromArray(buf,blen);

nPerson.name();

使用进阶

如果需要传递数组呢?

person.proto

syntax = "proto3";
package tutorial;

message Person {
int32 id = 1;
string name = 2;
string email = 3;
}
message Data {
repeated Person person = 1;
}

重新用它生成文件,就可以传递数组

tutorial::Data data ;
string stringbuf1;
for(int i =1;i<101;i++)
{
tutorial::Person *person1 = data.add_person();
stringbuf1=("abd" );
person1->set_name(stringbuf1);
stringbuf1 ="[email protected]" ;
person1->set_email(stringbuf1);
person1->set_id(i);
}

int total = data.ByteSize();
uint8_t *Databuf = new uint8_t[total+1];
memset(Databuf,0,total+1);
int dataRet = data.SerializeToArray(Databuf, total);

解析不再写了。粘一个更详细链

 

 

标签:XML,ndk,数据结构,Protobuf,person,set,android,序列化,protobuf
From: https://blog.51cto.com/u_12389088/6091498

相关文章

  • Android Studio 实现扫码功能
    因公司的需求,需要做一些安卓方面的开发,权衡许久,确定了使用AndroidStudio作为开发工具。对于安卓开发,目前还算小白一个,刚接触没几天。其中一项功能为安卓PDA扫码功能,因为......
  • 在android源码中编译ADW_Launcher
    1.下载ADW_Launcher源码 cd/android-2.1/packages/apps/ mkdirADW_Launcher cdADW_Launchergitclonegit://github.com/AnderWeb/android_packages_apps_Launcher.gi......
  • android string.xml文件中的整型和string型代替
    在android的开发中,经常会遇见一句话,比如“我今年23岁了”;这个23需要在程序中生成,但是遇到一个问题,这完整的一句话是一个TextView中的,而不是三个textView拼接成的,而且是引用......
  • Android开发--Intent-filter属性详解
    如果一个Intent请求在一片数据上执行一个动作,Android如何知道哪个应用程序(和组件)能用来响应这个请求呢?IntentFilter就是用来注册Activity、Service和Broadca......
  • Android通过flutter_module引入Flutter,无法热更。
    一、混合开发中启用Flutter的热重启/热加载Flutter开发时,默认自动开启热重启/热更新功能,改动代码后,一旦Ctrl+S保存代码,修改的内容马上会热更新......
  • 梦想Android版CAD控件(安卓CAD二次开发,安卓CAD控件)2023.02.26更新
    下载地址:https://www.mxdraw.com/ndetail_40240.html1. 增加willBeReturnStart事件2. 增加使用OpenGL缓存3. 优化界面响应时间4. 修改在个别图纸上大量的小对象图块,缩......
  • 在Eclipse配置安装Android详细教程(新手)
    下载开发资源1、下载最新的AndroidSDK​​https://code.google.com/android/download.html​​选择Windows版本的SDK,下载后直接解压缩就可以使用,为了在控制台中直接使......
  • Appstore和Androidmarket开发者账号申请的那点事
    作为一个开发者,不可避免的问题就是申请store的账户了,相信很多个人开发者一开始的时候都很迷茫,今天给大家收集整理下appstore和androidmarket的开发者申请流程,希望对大家有所......
  • Android应用实例(一)之---有道辞典VZ.0
    大家好,这是我做的一个简单的有道Android的DEMO,只是简单的雏形。界面设计也有点丑陋呵呵~看看下第一步:思路解析从界面看一共用了三个控件EditText,Button,WebView。其实是四......
  • 关于Android中Spinner的使用
    这是一个关于使用Android中Spinner控件的方法,一个简单的代码及测试效果如下:1、主程序packageext.owen.testSpinner;importandroid.app.Activity;importandroid.os.Bund......