C# ProtoMemberAttribute上的AsReference是如何工作的

C# ProtoMemberAttribute上的AsReference是如何工作的,c#,protobuf-net,C#,Protobuf Net,我有一个分布式客户机-服务器应用程序(多个服务器)。用户可以将数据从一台服务器发送到另一台服务器。只有在所有服务器上相同的(客户定义的)结构(akaDataType)中才允许这样做 因此,我确实使用protobuf net序列化了数据类型,并比较了二进制数据的MD5散列 但这里有一个陷阱:二进制数据是不同的(因此MD5散列),但所有属性(用ProtoMemberAttribute修饰)都有完全相同的值 我有几个字段定义了[ProtoMember(5,AsReference=true)],我怀疑内

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

因此,我确实使用protobuf net序列化了
数据类型
,并比较了二进制数据的MD5散列

但这里有一个陷阱:二进制数据是不同的(因此MD5散列),但所有属性(用
ProtoMemberAttribute
修饰)都有完全相同的值

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

有人知道那一代人是如何详细工作的吗

一般来说,依赖二进制protobuf等式是个坏主意吗

我们正在使用VS2010。Net 4.0。一个协议net 2.0.0.668。

我不知道为什么它是不确定的,但我也不会绝对保证在任何情况下都是这样

一般来说,依赖二进制protobuf等式是个坏主意吗

是的。格式本身具有多种功能,相同的数据可以以不同的方式呈现:

  • 字段可以是任意顺序;库应按升序显示它们,但不要求
  • 作为上述示例,合并(连接)数据可能意味着语义相同的数据可以有多种形式,因为(只要字段不冲突)“块A,块B”在语义上应该与“块B,块A”相同
  • 该格式没有明确禁止变量编码的次正常形式;我的意思是
    5
    的正常和预期表示是
    0x05
    ,但是
    0x8500
    0x858000
    0x85808000
    (等)也是
    5
    的完全合法的各种表示
  • 如果您使用的是动态类型(仅protobuf net,而不是核心protobuf特性),那么类型的汇编版本将是输出的一部分;这是可以改变的

参考标签是如何准确生成的?我在源代码中找不到这个。我确实序列化了一个包含子数据类型的“数据类型”数组。某些“数据类型”的某些子项在某些服务器上是不同的(有更多的子项)。在我看来(当查看二进制数据时),引用标记的偏移量为1或2,就好像插入了一个值一样。没有动态类型,所有定义都很好。我还完成了属性排序。