我是使用 google protobuffers 的新手,我创建了一条基本消息:
message msg {
uint32 id = 1;
google.protobuf.Timestamp timestamp = 2;
}
Run Code Online (Sandbox Code Playgroud)
现在我创建了一个小型 C++ 程序来使用它[带有必要的标头]
int main(void) {
auto m = msg{};
m.set_id(2);
auto timestamp = google::protobuf::Timestamp{};
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);
m.set_allocated_timestamp(×tamp);
std::cout << m.id() << std::endl;
std::cout << m.timestamp().seconds() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,这个程序给出了一个段错误。
free(): invalid pointer
[1] 9537 abort (core dumped)
Run Code Online (Sandbox Code Playgroud)
我需要在哪里释放内存?
假设我有一个指针数组,每个指针指向结构,这些结构可能再次指向其中的其他结构; 是否有可能使用protobuf处理序列化?如果是这样,怎么样?
任何帮助将不胜感激.
我在Java中使用播放框架(使用SBT构建工具),需要消耗protobuf。所以我有xxx.proto文件。我得到了二进制协议编译器,并将其添加到类路径中。所以我看到-
protoc --version libprotoc 3.1.0
我已经使用-编译了xxx.proto文件,
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/xxx.proto因此它已经生成了xxx.java文件。
现在,当我编译此xxx.java文件时(使用sbt构建工具的项目)
[error] /my_project/app/helpers/xxx.java:7: package com.google.protobuf does not exist
[error] com.google.protobuf.ExtensionRegistryLite
[error] /my_project/app/helpers/xxx.java:11: package com.google.protobuf does not exist
[error] com.google.protobuf.ExtensionRegistry
[error] /my_project/app/helpers/xxx.java:6182: package com.google.protobuf.Descriptors does not exist
[error] com.google.protobuf.Descriptors.Descriptor
[error] /my_project/app/helpers/xxx.java:6185: package com.google.protobuf.GeneratedMessageV3 does not exist
[error] com.google.protobuf.GeneratedMessageV3.FieldAccessorTable`
Run Code Online (Sandbox Code Playgroud)
我在安装的库中看到com.google.protobuf jar。
我的xxx.proto如下-
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: xxx.proto
public final class xxx {
private xxx() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistryLite registry) {
} …Run Code Online (Sandbox Code Playgroud) 使用
find_package(Protobuf REQUIRED
PATHS ${PROTOBUF_SEARCH_PATH}
)
if (NOT ${Protobuf_FOUND})
message( FATAL_ERROR "Could not find Protobuf!" )
endif()
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS Foo.proto)
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息Unknown CMake command "protobuf_generate_cpp"。如果我检查 Protobuff 的安装文件夹,有一个<istall path>/cmake/protobuf-module.cmake包含函数定义的 CMake 文件。
CMake version: 3.10.2
Protobuf version: 3.6.1
Run Code Online (Sandbox Code Playgroud)
这里有什么问题?
我通过 vcpkg 安装了 protobuf vcpkg install protobuf:x64-windows。显然它安装了最新版本(3.6.1)。对于我需要版本<=3.5.1的项目。有没有办法使用 vcpkg 安装它?现在我只是使用 cmake 构建了 3.5.1,但是项目正在使用 vcpkg 的路径寻找 protobuf,我真的不知道是否允许我更改代码。
我按照这个例子做了,效果很好。
但有时(并非总是)当我更改一些与 protobuf 和重建完全无关的应用程序级代码时,bazel 会花费所有时间重新编译 protobuf。
有什么建议我可以尝试调试这个吗?
我在 ASPNETCore 之上使用 GRPC,也有这样的模型:
syntax = "proto3";
message Blob {
string id = 1;
string path = 2;
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试将该path属性设置为 null 时,它会抛出一个ArgumentException.
只需运行此代码:
new Blob { Path = null };
Run Code Online (Sandbox Code Playgroud)
结果如下:
System.ArgumentNullException: Value cannot be null. (Parameter 'value')
at Google.Protobuf.ProtoPreconditions.CheckNotNull[T](T value, String name)
at Grpc.Blob.set_Path(String value)
Run Code Online (Sandbox Code Playgroud) 问题描述
我将以下枚举结构添加到我的 protobuf 中:
enum FooType {
INVALID = 0;
OW = 1;
RT = 2;
OJ = 3;
MC = 4;
}
[...]
optional FooType foo_type = 22 [default = INVALID];
Run Code Online (Sandbox Code Playgroud)
如果我们插入一个大于 的值会发生什么4?这个想法是,每个值都大于4应有的值INVALID。我正在检查我这边的代码。
if(Foo > 4) {
Foo = 0;
}
//add to protobuf
Run Code Online (Sandbox Code Playgroud)
这个解决方案看起来很脏。有没有办法在 protobuf 中的某个位置设置该条件。
Protobuf 生成的代码
在生成的代码中,我们有以下条件。
case 22: {
if (tag == 176) {
parse_itinerary_type:
int value;
DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
input, &value)));
if (::sss::model::protoBom::common::Context_FooType_IsValid(value)) {
set_itinerary_type(static_cast< ::sss::model::protoBom::common::Context_FooType >(value));
} …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用 protobuf 进行数据序列化的 C++17 项目,但我遇到了一个问题。
我试图将 protobuf 中定义的一个对象序列化为 std::string ,并且该对象只有一个枚举字段,当不小心将该字段的值设置为 0 时,函数 SerializeAsString() 或 SerializToString(std::string*) 将返回 true 但我总是得到一个空字符串。我查看了 google api 参考资料,但没有得到任何帮助,有人可以帮助我吗?我写了一些代码来说明这个问题。
假设我们想在 testProtobuf.proto 中定义一种消息
syntax = "proto3";
package pb;
message testPackage{
enum testEnums{
TEST_0=0;
TEST_1=1;
TEST_2=2;
}
testEnums enumValue=1;
}
Run Code Online (Sandbox Code Playgroud)
我使用编译它
protoc --cpp_out=./ testProtobuf.proto
Run Code Online (Sandbox Code Playgroud)
在 testProtobuf.cpp 中我们有:
#include<iostream>
#include<string>
#include "testProtobuf.pb.h"
int main(){
pb::testPackage t0,t1,t2;
t0.set_enumvalue(pb::testPackage::TEST_0);
t1.set_enumvalue(pb::testPackage::TEST_1);
t2.set_enumvalue(pb::testPackage::TEST_2);
std::cout<<t0.ShortDebugString()<<"\n"<<t1.ShortDebugString()<<"\n"<<t2.ShortDebugString()<<std::endl;
std::string temp;
std::cout<<"Success? "<<t0.SerializeToString(&temp)<<", Length: "<<temp.length()<<std::endl;
std::cout<<"Success? "<<t1.SerializeToString(&temp)<<", Length: "<<temp.length()<<std::endl;
std::cout<<"Success? "<<t2.SerializeToString(&temp)<<", Length: "<<temp.length()<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我们编译文件:
g++ testProtobuf.cpp testProtobuf.pb.cc …Run Code Online (Sandbox Code Playgroud) 我只是想知道,为什么没有人解决我最近遇到的与 google protobufs 相关的问题,但是经过广泛的谷歌搜索、阅读谷歌手册页的文档并在 Stackoverflow-DB 中搜索后,我没有找到解决方案。
我在 Ubuntu 14.04.3 LTS 上使用 proto2-c++-API,通过 cmake 文件使用 gcc/g++ 进行编译。
我有一个从文件中读取二进制(序列化)google 协议缓冲区消息的应用程序。该程序的目的是将消息(不进行反序列化)发送到另一个应用程序,该应用程序继续处理实际数据。
我现在想修改一些消息,从文件中读取,以便我可以测试第二个应用程序的功能。不幸的是,我的消息包含很多嵌套消息,因此在反序列化之后我必须调用类似
message().a().b().c()....x().value();
Run Code Online (Sandbox Code Playgroud)
能够处理实际数据。
我现在的问题是,如何在x不创建另一个类型的消息的情况下更改 的值,message其中我还必须创建所有子消息 ( a,b,c...) 并将这些分配给各自的前任,就像下面的伪代码一样?!
a = new a();
b = new b();
c = new c();
...
v = new v();
w = new w();
x = new x();
x.set_value();
w.set_allocated_x_value(x);
v.set_allocated_w_value(w);
...
a.set_allocated_b_value(b);
message.set_allocated_a_value(a);
...
/* forward message to second application */
...
delete x;
delete w;
...
delete a;
Run Code Online (Sandbox Code Playgroud)
显然,不可能set_value …
尝试解析来自服务器的消息,该消息将线路类型作为 Start Group 传递。我正在使用 protobuf-c lib,其中不支持起始组和结束组(最新)。是否有任何示例如何使用线类型作为起始组,以便我自己解析消息
提前致谢
在编译原型文件时,我收到““int”未定义”。
“测试.proto”文件
syntax = "proto3";
package test;
option go_package = "/;test";
message User {
string FirstName = 1;
string LastName = 2;
string Address = 3;
int Contact = 4;
int Age = 5;
}
Run Code Online (Sandbox Code Playgroud)
Output:
test.proto:11:5: "int" is not defined.
Run Code Online (Sandbox Code Playgroud) protobuf-c ×12
protocol-buffers ×10
c++ ×5
c ×2
asp.net-core ×1
bazel ×1
cmake ×1
go ×1
grpc ×1
java ×1
protobuf-go ×1
protoc ×1
vcpkg ×1