Google协议缓冲区未编译C#

时间:2016-07-28 14:11:02

标签: c# protocol-buffers

这是我第一次使用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:预期的顶级语句(例如“message”)。   address.proto:1:2:解释非ascii代码点187。   address.proto:1:3:解释非ascii代码点191。

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

6 个答案:

答案 0 :(得分:1)

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

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

Wikipedia

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

答案 1 :(得分:1)

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

因此,删除所有必需/可选关键字

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

请注意: 将文件另存为ANSI或UTF-8,不要另存为UniCode。

您可以将v3安装为nuget包

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我也看到了这个问题,原来是.proto文件名与消息名称之一相同的症状。例如:

myProto .proto文件已包含

syntax = "proto2";

message myProto
{
    // a bunch of stuff
}

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

答案 5 :(得分:0)

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

错误消息:

解释非ASCII代码点205。

解释非ASCII代码点190。

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