You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:39:56