如何序列化protobuf中的反向关系

How to serialize reverse relationship in protobuf

我有以下原型文件

message Person {

    // ID
    required int32 id = 1;

    // name
    required string name = 2;

    // email
    optional string email = 3;

    // tasks
    repeated Task tasks = 4;
}

message Task {
    //ID
    required int32 id = 1;

    //owner
    optional Person owner =2;

}

person有任务列表,是一对多的关系。 在task中,我设置了person的反向关系,也就是一对一的关系。

我的问题是:当我在 person 对象中构建任务时,如何序列化与任务中当前 person 的反向关系,因为 person 对象尚未构建。请参阅 ????以下代码片段中的(问号)部分。 我有以下序列化代码。

PersonMsg.Person.Builder personBuilder = PersonMsg.Person.newBuilder();  
    personBuilder.setId(1);  
    personBuilder.setName("Alex");  
    personBuilder.setEmail("alex@gmail.com");  
    personBuilder.addTasks(PersonMsg.Task.newBuilder()
                            .setId(11)
                            .setOwner("??????"));
    personBuilder.addTasks(PersonMsg.Task.newBuilder()
                            .setId(12)
                            .setOwner("???????"));
    PersonMsg.Person xxg = personBuilder.build(); 

提前致谢!

这基本上是一个循环依赖,您需要解决它,否则程序将无法编译。

PersonTask 之间已经存在组合,因为 TaskPerson 的成员。基本上你不需要 link TaskPerson 因为已经存在 link.

如果您确实需要双精度 link,我建议使用对 Person 对象的消息引用(如外键)。

message Task {
    //ID
    required int32 id = 1;
    //owner
    optional int32 ownerId =2; //which is the owner Person id.

}

这不起作用,因为 Protocol Buffers 不支持指针。 Persontasks 字段不存储指向任务的指针,它存储实际的任务。 Taskowner 字段不存储指向人的指针,它存储完整的 Person。不能有两个具有相同 owner 的不同 Task,因为那样需要指针。

这意味着 Protobuf 消息始终是一棵严格的树。这与一般的 Java 不同,在一般情况下,对象形成任意图形,可能带有循环。

解决方案是让 Taskowner 字段存储一个人的 ID,而不是存储完整的 Person .那么您的代码将需要知道如何查找给定 ID 的 Person