ProtoMemberAttribute 上的 AsReference 如何工作

How does AsReference on the ProtoMemberAttribute work

我有一个分布式客户端-服务器应用程序(多个服务器)。用户可以将数据从一台服务器发送到另一台服务器。这仅允许(客户定义的)结构(又名 DataType)在所有服务器上都是相同的。

因此我使用 protobuf-net 序列化了 DataType 并比较了二进制数据的 MD5 散列。

但这里有一个问题:二进制数据不同(因此 MD5 哈希)但所有属性(用 ProtoMemberAttribute 修饰)具有完全相同的值!

我有几个字段已定义 [ProtoMember(5, AsReference = true)] - 我怀疑内部识别标签的生成不是确定性的。

有谁知道那一代的详细工作原理吗?

一般来说,依赖二进制 protobuf 相等是不是个好主意?

我们正在使用 VS2010。净 4.0。一个 protobuf-net 2.0.0.668.

不知道它不确定的原因,但我也不会在每种情况下都绝对保证它。

Is it in general a bad idea to rely on binary protobuf equality?

是的,是的。格式本身有很多东西,相同的数据可以不同的方式呈现:

  • 字段可以按任何顺序排列;图书馆应该按升序排列,但不需要
  • 合并(连接)数据可以,作为上述示例,意味着语义相同的数据可以有多种形式,因为(只要字段不冲突)"chunk A, chunk B" 在语义上应该是与 "chunk B, chunk A"
  • 相同
  • 该格式没有明确禁止 varint 编码的次正规形式;我的意思是 5 正常和预期 表示是 0x05,但是 0x85000x8580000x85808000 (等)是 5
  • 的所有完全合法的 varint 表示
  • 如果您使用动态类型(仅限 protobuf-net,不是核心 protobuf 功能),则类型的汇编版本将成为输出的一部分;这可以改变