Protobuf嵌套结构下Java中TimeStamp对象添加方法咨询
Protobuf嵌套重复字段的Java对象创建解决方法
先看你给出的Protobuf结构:
syntax = "proto3"; package com.test.ps.speed.schema.v0; message SpeedTestData { string segment_id = 1; repeated Speed speed = 2; message Speed { double start = 1; // Start offset repeated TimeStampEpoch timestamp_epoch = 3; repeated TimeStampUtc timestamp_utc = 4; } message TimeStampEpoch { uint64 source_capture_time = 1; // Time when raw data was captured by Data Provider uint64 expiry_time = 2; // Time when the message expires } message TimeStampUtc { string source_capture_time = 1; // Time when raw data was captured by Data Provider string expiry_time = 2; // Time when the message expires } }
你写Java代码时,想给Speed对象加TimeStampEpoch和TimeStampUtc但卡壳了,核心问题有两个:
- 这俩字段是
repeated(重复)类型,Protobuf生成的Java Builder里没有set方法,而是用add或addAll来添加元素; - 嵌套消息需要先构建好实例,再添加到外层对象里。
给你写好正确的代码示例:
步骤1:先构建嵌套的时间戳对象
// 构建TimeStampEpoch实例,替换成你的实际业务值 SpeedTestData.TimeStampEpoch epoch = SpeedTestData.TimeStampEpoch.newBuilder() .setSourceCaptureTime(System.currentTimeMillis()) .setExpiryTime(System.currentTimeMillis() + 3600 * 1000) // 1小时后过期,可替换为实际值 .build(); // 构建TimeStampUtc实例,替换成你的实际UTC时间字符串 SpeedTestData.TimeStampUtc utc = SpeedTestData.TimeStampUtc.newBuilder() .setSourceCaptureTime("2024-05-20T14:30:00Z") .setExpiryTime("2024-05-20T15:30:00Z") .build();
步骤2:构建Speed对象并添加时间戳
SpeedTestData.Speed newLastSpeed = SpeedTestData.Speed.newBuilder() .setStart(2) // 这里用你从其他类拿到的实际值 .addTimestampEpoch(epoch) // 添加单个TimeStampEpoch,要加多个就多次调用add .addTimestampUtc(utc) // 添加单个TimeStampUtc,同理可多次调用 // 如果有多个时间戳要批量添加,用addAllTimestampEpoch(Collection<TimeStampEpoch>) .build();
关键说明
- 对于
repeated字段,Protobuf生成的Builder会提供addXXX(添加单个元素)和addAllXXX(添加集合)方法,没有setXXX方法; - 嵌套的内部消息(比如
TimeStampEpoch)必须先通过自身的newBuilder()构建完成,才能添加到外层的Speed对象里。
内容的提问来源于stack exchange,提问作者dhananjay_shingote
相关产品推荐
相关产品推荐

