代码之家  ›  专栏  ›  技术社区  ›  David Hedlund

protobuf-net中非必需字段的序列化

  •  2
  • David Hedlund  · 技术社区  · 16 年前

    我有一个工作的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 做。不管有没有我都试过了。。。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Marc Gravell    16 年前

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

    bool {memberName}Specified {get;set;} . 我正在查看一个现有的关于涉及默认空字符串的异常的开放报告。