我有一个工作的java客户机,通过ProtoBuf序列化消息与Google通信。我现在正试图把那个客户机翻译成C。
.proto
参数所在的文件
appId
message AppsRequest {
optional AppType appType = 1;
optional string query = 2;
optional string categoryId = 3;
optional string appId = 4;
optional bool withExtendedInfo = 6;
}
当我显式设置
应用程序ID
到
""
到
null
hasAppId
被设置为false(我不确定这将如何影响序列化)。
在C#客户端,我总是收到403个响应。我看不出不设置值和设置默认值之间的区别背后有什么逻辑,这似乎决定了java客户机的所有区别。因为输出总是一个二进制流,所以我不确定成功的java消息是用空字符串序列化的,还是根本没有序列化。
在C#客户端,我尝试设置
IsRequired
真的吗
ProtoMember
属性,强制它们序列化,我尝试将默认值设置为null,并显式设置
""
,所以我肯定我试过了
一些
ProtoBuf.ProtoIgnore
在某个时刻,移除
应用程序ID
我已经尝试从java手动复制序列化字符串,这解决了我的问题,因此我确信HTTP请求的其余部分正在工作,并且错误可以跟踪到序列化对象。
var clone = ProtoBuf.Serializer.DeepClone(request);
MemoryStream ms = new MemoryStream(2000);
ProtoBuf.Serializer.Serialize(ms, clone);
var bytearr = ms.ToArray();
string encodedData = Convert.ToBase64String(bytearr);
我承认我不太清楚
DeepClone
做。不管有没有我都试过了。。。