我个人的protobuf-3.5.2实践:安装与测试

本文介绍如何在CentOS7环境下安装并配置ProtoBuf,并提供了一个简单的示例来展示如何使用ProtoBuf进行消息的序列化和反序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:CentOS7

 

1、安装

github源代码下载地址:https://github.com/google/protobuf


chmod 777 -R protobuf-3.5.2
cd protobuf-3.5.2
./autogen.sh
./configure
make
make install
ldconfig #refresh shared library cache

 

执行protoc --version命令可以查看版本

firecats-MacBook-Pro:~ liuquandan$ which protoc

/usr/local/bin/protoc

firecats-MacBook-Pro:~ liuquandan$ protoc --version

libprotoc 3.5.2


通常情况ProtoBuf都安装在/usr/local目录下,该目录下包含了ProtoBuf的头文件,静态库和动态库文件
/usr/local/bin/protoc
/usr/local/include/google/protobuf
/usr/local/lib/libprotobuf.*

protoc:protobuf自带的编译工具,将.proto文件生成指定的类
–cpp_out:指定输出特定的语言和路径

 

 

 

2、写demo测试

helloworld.proto

syntax = "proto3";

package lm; 
message helloworld 
{ 
    int32     id = 1;  // ID 
    string    str = 2;  // str 
}

person.proto

syntax="proto3";
package tutorial;

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

	enum PhoneType
	{
		MOBILE = 0;
		HOME = 1;
		WORK = 2;
	}

	message PhoneNumber
	{
		string number = 1;
		PhoneType type = 2; 
	}

	repeated PhoneNumber phone = 4;
}

message AddressBook
{
	repeated Person person =1;
}

protoc -I=./ --cpp_out=./ helloworld.proto
protoc -I=./ --cpp_out=./ person.proto

 

会自动生成文件:

helloworld.pb.h

helloworld.pb.cc

person.pb.h

person.pb.cc

 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(pbtest)

#set(SRC .)
#查找当前目录下的所有源文件,并将名称保存到DIR_SRCS变量
aux_source_directory(. DIR_SRCS)

add_executable(${PROJECT_NAME} ${DIR_SRCS})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} protobuf)

 

main.cpp

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string>
#include <pthread.h>
#include <fstream>
#include "helloworld.pb.h"

using namespace std;
#define BUFFSIZE 1024

int main()
{
    GOOGLE_PROTOBUF_VERIFY_VERSION;

    //eg1, write file
    lm::helloworld msg1;
    msg1.set_id(1001);
    msg1.set_str("hello world");

    fstream output("./log", ios::out | ios::trunc | ios::binary);
    if (!msg1.SerializeToOstream(&output)) {
        cerr << "Failed to write msg." << endl;
        return -1;
    }

    output.close();
    cout << msg1.id() << endl;
    cout << msg1.str() << endl;

    //eg2, read file
    lm::helloworld msg2;
    fstream input("./log", ios::in | ios::binary);
    if (!input)
    {
        cerr << "open file failed!\n";
        return -1;
    }

    if (!msg2.ParseFromIstream(&input)) {
        cerr << "Parse file failed!" << endl;
        return -1;
    }

    input.close();
    cout << msg2.id() << endl;
    cout << msg2.str() << endl;

    //eg3, write buf, protobuf序列化
    lm::helloworld msg3;
    msg3.set_id(1002);
    msg3.set_str("good idea");
    char buf[BUFFSIZE];
    memset(buf, 0, BUFFSIZE);
    msg3.SerializeToArray(buf, BUFFSIZE);

    //eg4, read buf, protobuf反序列化
    lm::helloworld msg4;
    msg4.ParseFromArray(buf, BUFFSIZE);
    cout << msg4.id() << endl;
    cout << msg4.str() << endl;

    // Optional:  Delete all global objects allocated by libprotobuf.
    google::protobuf::ShutdownProtobufLibrary();

    return 0;
}

 

 

编译通过,但是运行时会报错:error while loading shared libraries: libprotobuf.so.15: cannot open shared object file: No such file or directory
此时需要在/etc/ld.so.conf中加入librdkafka.so所在的目录:/usr/local/lib/
然后在终端执行命令,使之生效:
[root@localhost etc]# ldconfig

注意,/usr/local/lib/每次有库文件更新,都需要终端重新运行一次ldconfig这条命令。

 

框架一第一章 绪论 1.1 研究背景意义  1.1.1 移动互联网发展趋势  1.1.2 即时通讯软件的应用价值 1.2 国内外研究现状  1.2.1 国外即时通讯技术发展  1.2.2 国内Android应用研发现状 1.3 研究内容方法 1.4 论文结构安排 第二章 系统开发基本技术 2.1 Android系统架构分析  2.1.1 Linux内核层  2.1.2 系统运行库层  2.1.3 应用框架层  2.1.4 应用层 2.2 Android开发核心技术  2.2.1 Java/Kotlin语言特性  2.2.2 Android SDK组成  2.2.3 四大组件(Activity/Service/Broadcast/ContentProvider) 2.3 开发工具链  2.3.1 Android Studio开发环境  2.3.2 Gradle构建工具  2.3.3 Git版本控制 2.4 即时通讯协议分析  2.4.1 HTTPWebSocket对比  2.4.2 XMPP协议解析  2.4.3 MQTT轻量级协议 第三章 Android系统设计 3.1 需求分析  3.1.1 功能需求(登录/聊天/通讯录/消息推送)  3.1.2 非功能需求(性能/安全性/兼容性) 3.2 系统架构设计  3.2.1 MVCMVVM模式选择  3.2.2 模块化设计思想 3.3 核心模块设计  3.3.1 用户模块(注册/登录/个人信息)  3.3.2 即时通讯模块(消息收发/文件传输)  3.3.3 通讯录管理模块  3.3.4 消息通知模块 3.4 数据库设计  3.4.1 E-R图设计  3.4.2 SQLite表结构设计 3.5 UI/UX设计  3.5.1 Material Design设计原则  3.5.2 界面交互流程设计 3.6 安全性设计  3.6.1 数据传输加密(SSL/TLS)  3.6.2 用户认证机制 第四章 系统实现测试 4.1 开发环境搭建  4.1.1 Android Studio配置  4.1.2 模拟器真机调试 4.2 核心功能实现  4.2.1 用户模块实现(注册登录流程)  4.2.2 即时通讯功能实现(Socket编程)  4.2.3 消息存储同步机制  4.2.4 通知推送集成(Firebase Cloud Messaging) 4.3 数据库实现  4.3.1 Room持久化库应用  4.3.2 数据缓存策略 4.4 系统测试  4.4.1 测试方案设计  4.4.2 功能测试用例(黑盒/白盒测试)  4.4.3 性能测试(响应时间/内存占用)  4.4.4 兼容性测试(不同Android版本) 4.5 测试结果分析 第五章 结论展望 5.1 研究成果总结 5.2 系统不足改进方向 5.3 移动应用开发趋势展望框架二### 目录 第一章 引言 1.1 研究背景意义 1.2 国内外研究现状 1.3 论文主要研究内容 1.4 论文组织结构 第二章 Android系统相关技术研究 2.1 Android系统体系架构 2.1.1 Linux内核层 2.1.2 系统运行时库层 2.1.3 应用框架层 2.1.4 应用层 2.2 Android设计方法开发语言 2.2.1 MVC/MVP/MVVM架构模式 2.2.2 Java/Kotlin语言特性 2.2.3 XML布局设计 2.3 Android Studio开发工具 2.3.1 AS功能模块分析 2.3.2 调试性能优化工具 第三章 聊天软件需求分析 3.1 功能模块划分核心需求 3.1.1 用户管理模块(注册、登录、安全验证) 3.1.2 消息通信模块(文本、图片、语音) 3.1.3 联系人管理模块(添加、分组、黑名单) 3.1.4 文件传输模块(类型支持、大小限制) 3.2 非功能需求实现约束  3.2.1 性能实时性(延迟、并发)  3.2.2 安全性设计(数据传输存储)  3.2.3 兼容性要求(Android版本、屏幕适配) 3.3 技术选型可行性验证  3.3.1 开发工具链选型(Android Studio、Firebase)  3.3.2 网络协议选择(WebSocket vs. XMPP)  3.3.3 数据库加密方案(SQLite + SQLCipher) 第四章 系统设计实现 4.1 系统总体架构设计 4.1.1 客户端-服务器模式 4.1.2 技术选型(如Socket/WebSocket、XMPP协议) 4.2 核心模块设计 4.2.1 用户认证模块 4.2.2 消息传输模块(文本、图片、语音) 4.2.3 数据库设计(SQLite/Realm) 4.2.4 网络通信模块(Retrofit/OkHttp) 4.3 界面设计实现 4.3.1 Material Design规范应用 4.3.2 核心界面原型(聊天列表、对话窗口) 4.4 安全性设计 4.4.1 HTTPS通信加密 4.4.2 本地数据加密存储 第五章 系统测试优化 5.1 测试策略方法 5.1.1 测试环境配置(硬件+软件) 5.1.2 自动化测试框架(Espresso+JUnit) 5.2 功能测试用例结果 5.2.1 核心功能验证(消息收发/文件传输) 5.2.2 边界条件测试(弱网/高负载) 5.3 性能测试分析 5.3.1 基准性能测试(响应时间/吞吐量) 5.3.2 压力测试(并发用户/消息洪峰) 5.4 安全性兼容性测试 5.4.1 OWASP Top 10漏洞扫描 5.4.2 多设备适配测试 5.5 优化策略效果 5.5.1 消息队列优化(优先级队列) 5.5.2 内存泄漏治理(LeakCanary) 第六章 总结展望 6.1 研究成果总结 6.2 存在的问题改进方向 参考文献 附录(代码片段、界面截图、测试报告等)比较两个框架更推荐使用哪个 说明两个论文框架的优缺点 难易程度 是否符合论文要求 设计思路
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值