asp.net gRPC.net在序列化过程中能否识别相同的引用类型?

bejyjqdl  于 2023-02-06  发布在  .NET
关注(0)|答案(1)|浏览(114)

在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;

}
同一个对象在被多个列表引用、序列化和反序列化之后是否仍然相同?

mwkjh3gx

mwkjh3gx1#

关于您的第一个问题 * 对于您发布的以下消息格式,在.NET gPRC中编码时是否会识别和压缩相同的引用类型?*:

repeated Teacher Teachers = 1;
message Teacher{
  int Id = 1;
  repeated Student Students = 2;
}

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

相关问题