这是我第一次使用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,它也要求必需或可选。
当我添加required
或optional
时,我会收到这些消息,但没有.cs文件。
address.proto:1:1:解释非ascii代码点239。 address.proto:1:1:预期的顶级语句(例如“message”)。 address.proto:1:2:解释非ascii代码点187。 address.proto:1:3:解释非ascii代码点191。
我错过了什么或做错了什么?
答案 0 :(得分:1)
我认为您的文本编辑器在address.proto
文件的开头静默插入字节顺序标记。错误消息意味着文件中的前三个字节是239 187 191
或EF BB BF
,这是UTF-8字节顺序标记:
Encoding Hexadecimal Decimal CP1252 characters
UTF-8 EF BB BF 239 187 191 
您使用的是哪种文本编辑器?如果您使用的是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 ,错误消失了。