[TDW]Protobuf在腾讯数据仓库TDW的使用

[TDW]Protobuf在腾讯数据仓库TDW的使用,第1张

Protobuf在腾讯数据仓库TDW的使用_ IT技术精华

>

classLogonReqMessage:public::google::protobuf::MessageLite{public:LogonReqMessage();virtual~LogonReqMessage();//implementsMessage----------------------------------------------//下面的成员函数均实现自MessageLite中的虚函数。//创建一个新的LogonReqMessage对象,等同于clone。LogonReqMessageNew()const;//用另外一个LogonReqMessage对象初始化当前对象,等同于赋值 *** 作符重载(operator=)voidCopyFrom(constLogonReqMessage&from);//清空当前对象中的所有数据,既将所有成员变量置为未初始化状态。voidClear();//判断当前状态是否已经初始化。boolIsInitialized()const;//在给当前对象的所有变量赋值之后,获取该对象序列化后所需要的字节数。intByteSize()const;//获取当前对象的类型名称。::std::stringGetTypeName()const;//requiredint64acctID=1;//下面的成员函数都是因message中定义的acctID字段而生成。//这个静态成员表示AcctID的标签值。命名规则是k+FieldName(驼峰规则)+FieldNumber。staticconstintkAcctIDFieldNumber=1;//如果acctID字段已经被设置返回true,否则false。inlineboolhas_acctid()const;//执行该函数后has_acctid函数将返回false,而下面的acctid函数则返回acctID的缺省值。inlinevoidclear_acctid();//返回acctid字段的当前值,如果没有设置则返回int64类型的缺省值。inline::google::protobuf::int64acctid()const;//为acctid字段设置新值,调用该函数后has_acctid函数将返回true。inlinevoidset_acctid(::google::protobuf::int64value);//requiredstringpasswd=2;//下面的成员函数都是因message中定义的passwd字段而生成。这里生成的函数和上面acctid//生成的那组函数基本相似。因此这里只是列出差异部分。staticconstintkPasswdFieldNumber=2;inlineboolhas_passwd()const;inlinevoidclear_passwd();inlineconst::std::string&passwd()const;inlinevoidset_passwd(const::std::string&value);//对于字符串类型字段设置constchar类型的变量值。inlinevoidset_passwd(constcharvalue);inlinevoidset_passwd(constcharvalue,size_tsize);//可以通过返回值直接给passwd对象赋值。在调用该函数之后has_passwd将返回true。inline::std::stringmutable_passwd();//释放当前对象对passwd字段的所有权,同时返回passwd字段对象指针。调用此函数之后,passwd字段对象//的所有权将移交给调用者。此后再调用has_passwd函数时将返回false。inline::std::stringrelease_passwd();private:};

protobuf版本需要在protobuf程序中查看。

在protobuf程序中查看版本步骤如下所示:

1、点击打开计算机,进入分区列表。

2、在计算机分区列表中选择protobuf程序所在的文件夹。

3、点击打开protobuf程序。

4、如图所示在protobuf程序中,即可完成protobuf版本查看。

在windows下使用protobuf,编译成dll,在使用中提示下面错误( unresolved external symbol 

empty_string_once_init_@internal@protobuf@google@@3HA (int google::protobuf::internal::empty_string_once_init_),

empty_string_@internal@protobuf@google@@3PBV$basic_string@DU$char_traits@D@std@@V$allocator@D@2@@std@@B (class std::basic_string,class std::allocator> const const google::protobuf::internal::empty_string_)

提示这两个函数,而通过用dumpbin 查看libprotobufddll,其中导出了这两个函数,最后在这里找到

答案

需要在引用这个dll的工程中加入宏 PROTOBUF_USE_DLLS,通过搜索protobuf工程,发现定义这个宏之后,添加这个宏之后,会有下面的宏定义:

#define LIBPROTOBUF_EXPORT__declspec(dllimport)

有可能在加入pb之后,你的工程出现数百个未定义的类型,而明显在你的项目中,这些都是有定义的,这个时候,你可以考虑把pb消息的头文件添加到其他头文件之前

默认生成的xxxpbh,xxxpbcc的类在windows下都是没有_dllexport符号修饰,所以不可以在生成的dll中导出使用,可以通过 `protoc --cpp_out=dllexport_decl=MY_EXPORT_MACRO:path/to/output/dir myprotoproto`来实现为所有的类添加`MY_EXPORT_MACRO`修饰符。然后在另外一个h文件中定义`MY_EXPORT_MACRO`宏,然后在所有的头文件中包含它

Protobuf 是经过深思熟虑的消息打包方案,它的默认序列化格式没有包含消息的长度与类型,自然有其道理。哪些情况下不需要在 protobuf 序列化得到的字节流中包含消息的长度和(或)类型?我能想到的答案有:

如果把消息写入文件,一个文件存一个消息,那么序列化结果中不需要包含长度和类型,因为从文件名和文件长度中可以得知消息的类型与长度。

如果把消息写入文件,一个文件存多个消息,那么序列化结果中不需要包含类型,因为文件名就代表了消息的类型。

如果把消息存入数据库(或者 NoSQL),以 VARBINARY 字段保存,那么序列化结果中不需要包含长度和类型,因为从字段名和字段长度中可以得知消息的类型与长度。

如果把消息以 UDP 方式发生给对方,而且对方一个 UDP port 只接收一种消息类型,那么序列化结果中不需要包含长度和类型,因为从 port 和 UDP packet 长度中可以得知消息的类型与长度。

如果把消息以 TCP 短连接方式发给对方,而且对方一个 TCP port 只接收一种消息类型,那么序列化结果中不需要包含长度和类型,因为从 port 和 TCP 字节流长度中可以得知消息的类型与长度。

如果把消息以 TCP 长连接方式发给对方,但是对方一个 TCP port 只接收一种消息类型,那么序列化结果中不需要包含类型,因为 port 代表了消息的类型。

如果采用 RPC 方式通信,那么只需要告诉对方 method name,对方自然能推断出 Request 和 Response 的消息类型,这些可以由 protoc 生成的 RPC stubs 自动搞定。

对于最后一点,比方说 sudokuproto 定义为:

service SudokuService {

rpc Solve (SudokuRequest) returns (SudokuResponse);

}

那么 RPC method SudokuSolve 对应的请求和响应分别是 SudokuRequest 和 SudokuResponse。在发送 RPC 请求的时候,不需要包含 SudokuRequest 的类型,只需要发送 method name SudokuSolve,对方自知道应该按照 SudokuRequest 来解析(parse)请求。这个例子来自我的半成品项目 evproto。

对于上述这些情况,如果 protobuf 无条件地把长度和类型放到序列化的字节串中,只会浪费网络带宽和存储。可见 protobuf 默认不发送长度和类型是正确的决定。Protobuf 为消息格式的设计树立了典范,哪些该自己搞定,哪些留给外部系统去解决,这些都考虑得很清楚。

只有在使用 TCP 长连接,且在一个连接上传递不止一种消息的情况下(比方同时发 Heartbeat 和 Request/Response),才需要我前文提到的那种打包方案。(为什么要在一个连接上同时发 Heartbeat 和业务消息?请见陈硕《分布式系统的工程化开发方法》 p51 心跳协议的设计。)这时候我们需要一个分发器 dispatcher,把不同类型的消息分给各个消息处理函数,这正是本文的主题之一。

以上就是关于[TDW]Protobuf在腾讯数据仓库TDW的使用全部的内容,包括:[TDW]Protobuf在腾讯数据仓库TDW的使用、protobufjs中int64类型怎么解码、c++ protobuffer bytes 字段怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9276119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存