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