ProtoMemberAttribute上的AsReference如何工作

时间:2017-03-14 14:02:58

标签: c# protobuf-net

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

因此,我使用 protobuf-net 序列化DataType并比较二进制数据的MD5哈希值。

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

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

有谁知道这一代人的详细情况如何?

依靠二元protobuf平等一般是个坏主意吗?

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

1 个答案:

答案 0 :(得分:1)

  

依靠二元protobuf平等一般是个坏主意吗?

是的,确实如此。格式本身有多种内容,可以以不同的方式呈现相同的数据:

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