惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
宝玉的分享
宝玉的分享
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
WordPress大学
WordPress大学
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
罗磊的独立博客
The Cloudflare Blog
V
V2EX
月光博客
月光博客
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
博客园 - 【当耐特】
T
Tailwind CSS Blog

博客园 - zdleek

Vibe Coding(氛围编码/状态编程) 常用符号名称与读法 VSCode的【Microsoft C/C++ 扩展 】的使用简介[由DS给出] 小记VS code调用VC++编译器的环境配置 小记:DS给的一个lamda表达式例子 GPG4win 加解密使用笔记 Windows 11 Version 22H2 (Build 22621) 开发者资源下载 U盘启动多系统工具Ventoy 15种经典机器学习算法[转] 微软原版WIN10PE制作流程 [转]如何彻底关闭win10自动更新 C++模板的哲学 正则表达式简介 C++ 正则表达式使用例子 Lambda 表达式简介 一段bitset的简单例子 在VC++中的使用gRPC编程 Win10下编译gRPC主要步骤 Win10下编译ProtoBuf主要步骤
在VC++中使用ProtoBuf进行数据序列化的编程
zdleek · 2022-07-06 · via 博客园 - zdleek

准备工作:Win10下编译ProtoBuf的主要步骤

在VC++中使用ProtoBuf,

1,新建一个文本文件,另存文件名为person.proto, 在文件中定义Proto消息,如下:

syntax = "proto3";

    package myPbMsg;

    message Person {
      optional string name = 1;
      optional int32 id = 2;
      optional string email = 3;
     
      enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
      }
     
      message PhoneNumber {
        optional string number = 1;
        optional PhoneType type = 2;
      }
     
      repeated PhoneNumber phone = 4;
    }

2,用Protoc.exe编译Proto消息(在准备工作中,已经获得protoc.exe),可将如下代码保存为comp_person.bat,执行此批处理文件即可编译person.proto。

  person.proto, com_person.bat 需拷贝至protoc.exe相同的文件夹,编译后生成person.pb.h, person.pb.cc两个C++文件

echo "以下命令,会编译person.proto,生成c++的文件"
protoc.exe --cpp_out=.  person.proto  
pause

3,新建VC++控制台项目,将上述步骤2生成的c++文件复制到VC项目源代码路径下,并将这两个文件加入项目中:person.pb.h, person.pb.cc;

  此外,需将ProtoBuf源代码中的google文件夹复制到VC++项目文件夹路径之下, 将google文件夹路径加入VC++项目的输入路径;

  还需将libprotobuf.lib包含进VC项目(项目属性->链接器->输入:(Debug)添加 libprotobufd.lib; (Release)添加 libprotobuf.lib)。

4, person.pb.h文件中需手动添加一个预定义宏,以解决编译时提示的一个链接错误,如下:

  #define PROTOBUF_USE_DLLS

5,ProtoBuf序列化和反序列化操作,例子如下:

#include "stdafx.h"
#include <fstream>
#include "person.pb.h"
using namespace std;
using namespace myPbMsg;

//Person序列化
void person_serialize()
{
    Person person;
    person.set_name("Mike Jordon");
    person.set_id(1001);
    person.set_email("MikeJD@email.com");
    Person_PhoneNumber *pPhone = person.add_phone();
    pPhone->set_type(Person_PhoneType::Person_PhoneType_MOBILE);
    pPhone->set_number("13800138000");
    
    fstream output("myfile.serial", ios::out | ios::binary);
    person.SerializeToOstream(&output);
}

//Person反序列化
void person_unSerialize()
{
    fstream input("myfile.serial", ios::in | ios::binary);
    Person person;
    person.ParseFromIstream(&input);
    cout << "ID: " << person.id() << endl;
    cout << "Name: " << person.name() << endl;
    cout << "E-mail: " << person.email() << endl;
    if(person.phone().size()) cout << "Phone: " << person.phone().at(0).number() << endl;
}

int main()
{
    person_serialize();
    person_unSerialize();

    system("pause");
    return 0;
}

6,编译VC++工程,libprotobuf.dll文件复制到VC输出文件夹,执行VC生成的文件即可,VS2015的VC++编译时可能遇到一些错误提示,根据提示,在项目属性中添加如下预定义宏解决:

_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS

测试例子输出结果如下: