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

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但卡壳了,核心问题有两个:

  1. 这俩字段是repeated(重复)类型,Protobuf生成的Java Builder里没有set方法,而是用add或addAll来添加元素;
  2. 嵌套消息需要先构建好实例,再添加到外层对象里。

给你写好正确的代码示例:

步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:54:18