如何序列化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();
提前致谢!
这基本上是一个循环依赖,您需要解决它,否则程序将无法编译。
Person
和 Task
之间已经存在组合,因为 Task
是 Person
的成员。基本上你不需要 link Task
到 Person
因为已经存在 link.
如果您确实需要双精度 link,我建议使用对 Person 对象的消息引用(如外键)。
message Task {
//ID
required int32 id = 1;
//owner
optional int32 ownerId =2; //which is the owner Person id.
}
这不起作用,因为 Protocol Buffers 不支持指针。 Person
的 tasks
字段不存储指向任务的指针,它存储实际的任务。 Task
的 owner
字段不存储指向人的指针,它存储完整的 Person
。不能有两个具有相同 owner
的不同 Task
,因为那样需要指针。
这意味着 Protobuf 消息始终是一棵严格的树。这与一般的 Java 不同,在一般情况下,对象形成任意图形,可能带有循环。
解决方案是让 Task
的 owner
字段存储一个人的 ID,而不是存储完整的 Person
.那么您的代码将需要知道如何查找给定 ID 的 Person
。
我有以下原型文件
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();
提前致谢!
这基本上是一个循环依赖,您需要解决它,否则程序将无法编译。
Person
和 Task
之间已经存在组合,因为 Task
是 Person
的成员。基本上你不需要 link Task
到 Person
因为已经存在 link.
如果您确实需要双精度 link,我建议使用对 Person 对象的消息引用(如外键)。
message Task {
//ID
required int32 id = 1;
//owner
optional int32 ownerId =2; //which is the owner Person id.
}
这不起作用,因为 Protocol Buffers 不支持指针。 Person
的 tasks
字段不存储指向任务的指针,它存储实际的任务。 Task
的 owner
字段不存储指向人的指针,它存储完整的 Person
。不能有两个具有相同 owner
的不同 Task
,因为那样需要指针。
这意味着 Protobuf 消息始终是一棵严格的树。这与一般的 Java 不同,在一般情况下,对象形成任意图形,可能带有循环。
解决方案是让 Task
的 owner
字段存储一个人的 ID,而不是存储完整的 Person
.那么您的代码将需要知道如何查找给定 ID 的 Person
。