如果字段值为 0,proto 无法反序列化字段

问题描述 投票:0回答:1

我们序列化proto文件(proto3)并通过nats发送,如下。

我们订阅并接收来自发送端的数据,我们将这些数据转换为 json,并将消息转换为 json,如下所示。

std::string req_message_str;  
google::protobuf::util::MessageToJsonString(deserialized_set_ru_conf, &req_message_str);  
std::cout<<req_message_str<<std::endl;

我们看到默认值没有序列化并在传入数据中发送,但我们也有以下观察结果:

如果参数是可选的,即使它有默认值,它也会被序列化并且数据传给我们,但我们使用非可选参数。
我们想要序列化并发送参数,并在消息后查看该数据为 json。你能帮我解决这个问题吗?

我想查看 JSON 中的非可选字段。也许我需要传递像 JsonPrintOptions 这样的参数,但我不确定。

c++ json protocol-buffers
1个回答
0
投票

您没有包含 .proto 的相关部分,但这听起来像“存在跟踪”。基本上,最初在 proto3 中,唯一的选项是“隐式零默认值”,即如果它为零:则不发送;如果你使用的话,这就是你得到的:

syntax = "proto3";

message Foo {
    int32 id = 1;
}

然而,不久之后,“存在跟踪”作为一项可选功能被添加到 proto3 中,这意味着它会跟踪某个值是否被“显式分配”。这意味着如果一个字段被显式分配一个值包括零:它被序列化。如果你使用的话,这就是你得到的: syntax = "proto3"; message Foo { optional int32 id = 1; }

所以:尝试添加 
optional

修饰符。

    

© www.soinside.com 2019 - 2024. All rights reserved.