标签: protobuf-c

带有 google 时间戳的 Protobuf C++ 消息导致 seg 错误

我是使用 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(&timestamp);

  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)

我需要在哪里释放内存?

c++ protocol-buffers protobuf-c

6
推荐指数
1
解决办法
4037
查看次数

使用C/C++中的ProtoBuf进行深度复制

假设我有一个指针数组,每个指针指向结构,这些结构可能再次指向其中的其他结构; 是否有可能使用protobuf处理序列化?如果是这样,怎么样?

任何帮助将不胜感激.

c c++ protocol-buffers protobuf-c

5
推荐指数
1
解决办法
4101
查看次数

使用SBT构建工具在Java中编译Protobufs的编译错误

我在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)

java protocol-buffers protobuf-c protoc

5
推荐指数
1
解决办法
4965
查看次数

CMake 找不到 Protobuf `protobuf_generate_cpp`

使用

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)

这里有什么问题?

cmake protocol-buffers protobuf-c

5
推荐指数
3
解决办法
6101
查看次数

通过 vcpkg 安装旧版本的 protobuf

我通过 vcpkg 安装了 protobuf vcpkg install protobuf:x64-windows。显然它安装了最新版本(3.6.1)。对于我需要版本<=3.5.1的项目。有没有办法使用 vcpkg 安装它?现在我只是使用 cmake 构建了 3.5.1,但是项目正在使用 vcpkg 的路径寻找 protobuf,我真的不知道是否允许我更改代码。

protobuf-c vcpkg

5
推荐指数
2
解决办法
2304
查看次数

bazel 重新编译 protobuf 超过必要的程度

我按照这个例子做了,效果很好。

但有时(并非总是)当我更改一些与 protobuf 和重建完全无关的应用程序级代码时,bazel 会花费所有时间重新编译 protobuf。

有什么建议我可以尝试调试这个吗?

protocol-buffers protobuf-c bazel

5
推荐指数
1
解决办法
916
查看次数

Google.Protobuf 不允许属性为 null

我在 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)

protocol-buffers protobuf-c grpc asp.net-core

5
推荐指数
1
解决办法
1703
查看次数

Protobuf:如果枚举集中不存在赋予枚举的值怎么办?

问题描述

我将以下枚举结构添加到我的 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)

c++ protobuf-c

5
推荐指数
0
解决办法
390
查看次数

在 protobuf C++ 中处理枚举值 0

我正在开发一个使用 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)

c++ protocol-buffers protobuf-c

4
推荐指数
1
解决办法
4369
查看次数

在 C++ 中更改现有 protobuf 消息的元素

我只是想知道,为什么没有人解决我最近遇到的与 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 …

c++ protocol-buffers protobuf-c

3
推荐指数
1
解决办法
3777
查看次数

谷歌协议缓冲区线类型开始组和结束组使用

尝试解析来自服务器的消息,该消息将线路类型作为 Start Group 传递。我正在使用 protobuf-c lib,其中不支持起始组和结束组(最新)。是否有任何示例如何使用线类型作为起始组,以便我自己解析消息

提前致谢

c protocol-buffers protobuf-c

2
推荐指数
1
解决办法
2787
查看次数

当我尝试在 golang 中编译 Protobuf 时,它显示“int”未定义。

在编译原型文件时,我收到““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)

go protocol-buffers protobuf-c protobuf-java protobuf-go

1
推荐指数
1
解决办法
1878
查看次数