gpt4 book ai didi

c# - protobuf-net 中非必填字段的序列化

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:19 26 4
gpt4 key购买 nike

我有一个工作的 java 客户端,它通过 ProtoBuf 序列化消息与 Google 通信。我目前正在尝试将该客户端翻译成 C#。

我有一个 .proto 文件,其中参数 appId 是可选字符串。它在 protobuf-net 库生成的 C# 表示中的默认值为空字符串,就像在同一文件的 java 表示中一样。

message AppsRequest {
optional AppType appType = 1;
optional string query = 2;
optional string categoryId = 3;
optional string appId = 4;
optional bool withExtendedInfo = 6;
}

我发现当我在 java 客户端中将 appId 显式设置为 "" 时,客户端停止工作(来自 Google 的 403 错误请求)。当我在 Java 客户端中将 appId 显式设置为 null 时,一切正常,但这只是因为 hasAppId 被设置为 false(我不确定至于这如何影响序列化)。

在 C# 客户端中,我总是收到 403 响应。我没有看到不设置值和设置默认值之间的区别背后的任何逻辑,这似乎在 java 客户端中产生了所有差异。由于输出始终是二进制流,我不确定成功的 java 消息是用空字符串序列化,还是根本没有序列化。

在 C# 客户端中,我尝试将 ProtoMember 属性的 IsRequired 设置为 true,以强制它们进行序列化,并且我尝试设置默认值为 null,并显式设置 "",所以我很确定我已经尝试了一些值被序列化的配置。我也玩过 ProtoBuf.ProtoIgnore 并在某些时候完全删除了 appId 参数,但我无法避免 C# 中的 403 错误。

我已经尝试从 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 的作用。我已经尝试过使用和不使用它...

最佳答案

听起来我们想强制排除它;首先要尝试的是,您可以尝试在代码生成中使用“detectmissing”选项。这可以通过 IDE 和命令行实现,但有所不同(让我知道您使用的是哪个,我会添加更多)。

另一个类似的选项是添加(在部分类中)bool {memberName}Specified {get;set;}。我正在查看一份关于涉及默认空字符串的异常的现有公开报告。

关于c# - protobuf-net 中非必填字段的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2810295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com