Qt 6.8 Protobuf序列化默认值转JSON时丢失默认值的问题
Qt Protobuf序列化JSON时默认值丢失问题
我在proto文件中定义了如下消息:
message GeoCoord { double lat = 1; double lon = 2; }
使用Qt Protobuf将该消息序列化为JSON并通过WebSocket发送后,遇到了默认值处理的问题。
常规使用场景下:
QProtobufJsonSerializer serializer_json; GeoCoord geo; geo.setLat(1.1); geo.setLon(2.2); QByteArray message = geo.serialize(&serializer_json); socket->send(message)
接收方得到的消息为{"geoCoords":{"lat":1.1,"lon":2.2}},符合预期。但当主动设置double类型的默认值0时:
geo.setLat(0); geo.setLon(0);
得到的消息却是{"geoCoords":{}},这和完全不设置值的情况一致:
GeoCoord geo; QByteArray message = geo.serialize(&serializer_json);
请问是否有常规方法处理默认值?我知道double类型可以设为-0,但我的消息中还有int类型字段。
解决方案
修改序列化器配置,强制输出默认值
Qt Protobuf的QProtobufJsonSerializer支持配置选项,通过开启IncludeDefaultValues参数,可强制序列化时输出所有字段的默认值(无论是否主动设置)。示例代码:QProtobufJsonSerializer serializer_json; QProtobufJsonSerializer::FormatOptions options; options.setIncludeDefaultValues(true); serializer_json.setFormatOptions(options); GeoCoord geo; geo.setLat(0); geo.setLon(0); QByteArray message = geo.serialize(&serializer_json); // 此时输出会包含lat:0和lon:0,int类型字段设置默认值后也会正常输出在proto文件中显式指定默认值(可选)
若需要为特定字段定义自定义默认值,可在proto中通过default关键字声明。配合上面的序列化器配置,无论是否主动设置值,都会输出该默认值:message GeoCoord { double lat = 1 [default = 0.0]; double lon = 2 [default = 0.0]; int32 count = 3 [default = 0]; }利用
hasXXX()标记字段状态
Qt Protobuf生成的类会自动生成hasLat()、hasLon()这类方法,主动调用setLat(0)后hasLat()会返回true,但仅靠这个标记无法让默认值输出,必须结合IncludeDefaultValues配置才能生效。
内容的提问来源于stack exchange,提问作者Maleno
相关产品推荐
相关产品推荐

