如何在protobuf文件中描述Java嵌套列表?

时间:2019-03-07 02:44:59

标签: java protocol-buffers protobuf-java

我有一个Java类,包括一个嵌套列表字段,如:

private List<List<List<Integer>>> data;

但是如何在protobuf文件中描述它? 我这样尝试,但无法正常工作

repeated repeated repeated double data = 1;

==============更新====================

我尝试了İlkerKorkut的答案,但是当我想将json转换为protobuf时,它失败了。我的json如下:

{"data":[[[139,35],[138,34]]]}

和我的protobuf文件如下:

syntax = "proto3";
option java_package = "com.y.probuf";

message A {
    message B{
        message C {
            repeated int32 score = 1;
        }
        repeated C item = 1;
    }
    repeated B data = 1;
}

使用Java代码将json转换为protobuf:

User.A.Builder builder = User.A.newBuilder();
JsonFormat.parser().merge(s,builder);
User.A a = builder.build();
System.out.println(a.toString());

它引发异常“期望消息对象,但得到:[[139,35],[138,34]]”

maven文件如下:

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.6.1</version>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>3.6.1</version>
</dependency>

请帮助我!

1 个答案:

答案 0 :(得分:0)

根据protobuf文档;您必须创建嵌套的消息类型,以便在需要时将数据保存在嵌套列表中。

我准备了一个例子;

syntax = "proto3";
package protobuf;

option java_package = "mypackage";
option java_outer_classname = "MyObject";

message A {
    message B {
        message C {
            repeated string name = 1;
        }
        repeated C c = 1;
    }
    repeated B b = 1;
}

您当然可以定义外部消息类型,并在父消息中将其作为属性传递。