【问题标题】:Google Protocol Buffer not compiling for C#谷歌协议缓冲区没有为 C# 编译
【发布时间】:2020-12-11 07:01:54
【问题描述】:

这是我第一次尝试使用 Google Protocol Buffer 编写原型。我的文件如下所示:

syntax = "proto3";
package Clark.EDI.Protos;

// [START csharp_declaration]
option csharp_namespace = "Clark.EDI.Protos";
// [END csharp_declaration]

// [START messages]
message Address {
  required int32 addressId = 1;
  optional string namePrimary = 2;
  optional string nameSecondary = 3;
  optional string streetPrimary = 4;
  optional string streetSecondary = 5;
  optional string city = 6;
  optional string stateCode = 7;  
  optional string zipCode = 8;
  optional string countryCode = 9;  
}
// [END messages]

我正在尝试像这样编译它:

protoc --csharp_out=src address.proto

即使我将其定义为 proto3,它也要求必需或可选。

当我包含 requiredoptional 时,我会收到这些消息,但没有 .cs 文件。

address.proto:1:1:解释非 ascii 代码点 239。 address.proto:1:1:预期的顶级声明(例如“消息”)。 address.proto:1:2:解释非 ascii 代码点 187。 address.proto:1:3:解释非 ascii 代码点 191。

我错过了什么或做错了什么?

【问题讨论】:

  • 239可能是unicode字节序标记,保存文件为ansi
  • 来自视觉工作室?什么编码?
  • 必需/可选在 proto3 中被删除

标签: c# protocol-buffers


【解决方案1】:

我认为您的文本编辑器会在 address.proto 文件的开头静默插入字节顺序标记。错误信息暗示文件中的前三个字节是239 187 191,或者EF BB BF,这是UTF-8字节顺序标记:

Encoding    Hexadecimal    Decimal        CP1252 characters
UTF-8       EF BB BF       239 187 191    

Wikipedia

您使用的是哪个文本编辑器?如果您使用的是 Windows,请尝试在 Notepad 或 Notepad++ 中打开文件。如果您摆弄编码设置,您应该会在文件开头看到 3 个意外字符。删除它们。

【讨论】:

【解决方案2】:

如果您使用的是 protoc binary v3,则会删除必需/可选关键字。

所以,删除所有必需/可选的关键字

我使用 V3 编译了您的消息,并且在删除必需/可选关键字后编译成功。

注意: 将文件保存为 ANSI 或 UTF-8,不要保存为 Unicode。

您可以将 v3 安装为 nuget 包

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,因为我从 pdf 中复制了它。在我手动编码后,它工作了。

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,结果我不小心将不间断的空格放入 .proto 文件中(可能是通过我的 IDE 中的某个快捷方式)。可以通过使用例如 notepad++ 搜索“\xa0”来检查它。

      【讨论】:

        【解决方案5】:

        我也看到了这个问题,结果证明 .proto 文件名与消息的名称之一相同。例如:

        myProto包含.proto 文件

        syntax = "proto2";
        
        message myProto
        {
            // a bunch of stuff
        }
        

        将文件名更改为 myProtoFile.proto 保留了唯一性并满足了 proto 消息名称与 proto 文件名不同的需求......事后看来很明显,但花了我一点时间到达那里。

        【讨论】:

          【解决方案6】:

          我在 Visual Studio 2019 上遇到了同样的问题,因为我从在线 pdf 文件中复制了 .proto 文本,并且该文本采用 UTF-8 编码

          错误信息:

          解释非 ascii 代码点 205。

          解释非 ascii 代码点 190。

          我所做的是选择notepad++和编码菜单中的所有文本--> 转换为ANSI,错误消失了。

          【讨论】:

            猜你喜欢
            • 2012-05-11
            • 2012-11-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-19
            • 2016-02-09
            • 2014-05-02
            相关资源
            最近更新 更多