在net gPRC中编码时会识别和压缩相同的引用类型吗?我现在是多对多的关系,比如学生和老师,我直接定义一个
repeated Teacher Teachers = 1;
message Teacher{
int Id = 1;
repeated Student Students = 2;
}
然后只将学生数据包含在教师中(这会导致同一个学生被序列化以进行多次传输吗?),或者您需要自己维护关联关系,然后在客户机上重构关联关系?
repeated Teacher Teachers = 1;
repeated Student Students = 2;
message Student{
int Id = 1;
repated int StudentId = 2;
}
同一个对象在被多个列表引用、序列化和反序列化之后是否仍然相同?
1条答案
按热度按时间mwkjh3gx1#
关于您的第一个问题 * 对于您发布的以下消息格式,在.NET gPRC中编码时是否会识别和压缩相同的引用类型?*:
我非常肯定这里的答案是NO。protobuf编译器 protoc 从定义的protobuf消息生成C#代码隐藏文件,用于序列化和反序列化。您定义的重复字段Teachers将在代码隐藏文件中由RepeatedField Type表示,然后将使用RepeatedField Type将Teachers列表序列化和反序列化为二进制线格式。
因此,protoc将生成一个Teacher类型的 RepeatedField,它包含一个Student类型的 RepeatedField。此时已经没有多对多关系,基本上内存中只有一个教师列表,每个教师链接到一个学生列表,该列表分配有自己的内存,如果一个学生在不同的学生列表中出现两次,学生对象也将在存储器中的不同位置中两次,即使它们具有相同的Id值(并且因此对于相同的学生对象已经存在多个引用和存储器位置)。
因此,即使在gRPC的二进制序列化开始 * 之前 *,并且在传输任何数据 * 之前 ,在用于序列化和反序列化的代码中的student和teacher列表中也已经没有多对多关系。
关于你的主要问题 * gRPC.net在序列化过程中能识别相同的引用类型吗? 答案是gRPC将序列化带有代码隐藏文件中定义的引用的对象。在这种情况下,它们之间没有定义多对多的关系。并且不同列表中具有相同Id的学生对象将在不同的存储器位置中被复制并且具有不同的引用。因此,如果需要这样的关系,就必须在代码隐藏文件中对创建这样的关系的protobuf消息进行建模,否则就必须在反序列化之后手动重新构造它们,如前所述。