【问题标题】:Unable to encode .proto file into binary using protoc compiler types not defined无法使用未定义的 protoc 编译器类型将 .proto 文件编码为二进制文件
【发布时间】:2019-12-09 05:27:27
【问题描述】:

我正在尝试将 proto 文件转换为 HTTP 请求负载的二进制文件,但是,我收到来自 protoc 编译器工具的错误,返回类型未定义。我找不到与 --encode= 一起使用的类型定义的任何文档。

我尝试在 --encode 中指定不同的类型,但我发现的信息无关紧要。我尝试从 .proto 文件 ``` message DeviceAuthRequest { }

中指定 proto 消息的其他事情
protoc --encode=projname.auth TEST.proto > TEST.bin
Type not defined: projname.auth 
protoc --encode=DeviceAuthRequest TEST.proto > TEST.bin

--encode 和--decode 的实际类型是什么?我有 C# 中的源代码和编译代码。寻找一种在 proto 文件中使用修改后的数据制作有效负载的方法。

【问题讨论】:

  • 我很困惑......你说你有 C#......你不能使用 C# 生成的代码加载(反序列化)数据,将数据更改为对象 /i>,然后再序列化一下?
  • 比起修改生成的 C# 代码,我更喜欢使用 protoc 文件,因为我需要在多个 .proto 文件中频繁更改参数。 protoc --encode=[package].[message] test.proto > test.bin 我能够在没有消息类型错误的情况下执行 protoc,但是,在执行时,protoc cli 会挂起而不会生成二进制文件。
  • 但您只是想更改 数据 对吗?您根本不需要修改生成的文件;你只需要写大约 3 行反序列化、变异和序列化;我误解了这个问题吗?
  • 没错,这是修改实际数据的问题,以确保根据原始文件将格式正确的有效负载发送到 API。我只能访问接受 protobuf 消息的 API,而不是发送消息的客户端应用程序,因此我将生成自己的数据并相应地对其进行变异。
  • 我正在尝试以下仍然给我解析错误,不完全确定我的格式有什么问题。接收以下内容:输入:1:12:预期标识符,得到:“”5eb94f9c-ee3e-476a-ada9-4a84cf72ff28“”。解析输入失败。`protoc --encode packagetest.demo demo.proto < demo.txt > demo.binDemoIds: {"5eb94f9c-ee3e-476a-ada9-4a84cf72ff28"} SentTimeUtc: "2019-10-18T17:15:00Z" ContextId: 123123123原型演示文件message demo { repeated UserGuid DemoIds = 1; google.protobufTimestamp SentTimeUtc = 2; int32 ContextId = 3}

标签: protobuf-net protoc


【解决方案1】:

我不知道您指的是哪个 proto 架构,但语法应该类似于(在 Android 下使用 protoc 3.6.1 版本生成运营商标识符的示例):

cat carrier_list.textpb | protoc --encode=carrierIdentification.CarrierList -I/home/osboxes/Documents/ carrierId.proto > test.pb

我在您的示例中没有看到任何输入。 protoc 从标准输入读取输入,因此您必须输入一些数据,例如通过使用cat 命令。我也没有看到任何包含。您必须使用 -I 传递包含在其中搜索原始文件的位置。您的示例中也缺少这一点。如果遇到任何问题,请在此处使用绝对路径。

carrierId.proto 文件看起来像

syntax = "proto2";

package carrierIdentification;

option java_package = "com.android.internal.telephony";
option java_outer_classname = "CarrierIdProto";

// A complete list of carriers
message CarrierList {
  // A collection of carriers. one entry for one carrier.
  repeated CarrierId carrier_id = 1;
  // Version number of current carrier list
  optional int32 version = 2;
};

因此,在重新引用 proto 文件时,您必须使用 .(dot).carrierIdentification.CarrierList。

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2019-10-10
    • 2016-02-07
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多