data.dat中的内容:
0000: 00 01 00 00 00 ff ff ff ff 01 00 00 00 00 00 00 ................ 0010: 00 0c 02 00 00 00 4e 42 69 6e 61 72 79 53 65 72 ......NBinarySer 0020: 69 61 6c 69 7a 65 50 72 61 63 74 69 73 65 2c 20 ializePractise, 0030: 56 65 72 73 69 6f 6e 3d 31 2e 30 2e 30 2e 30 2c Version=1.0.0.0, 0040: 20 43 75 6c 74 75 72 65 3d 6e 65 75 74 72 61 6c Culture=neutral 0050: 2c 20 50 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e , PublicKeyToken 0060: 3d 6e 75 6c 6c 05 01 00 00 00 20 42 69 6e 61 72 =null..... Binar 0070: 79 53 65 72 69 61 6c 69 7a 65 50 72 61 63 74 69 ySerializePracti 0080: 73 65 2e 4d 79 4f 62 6a 65 63 74 02 00 00 00 1b se.MyObject..... 0090: 3c 42 6f 6f 6c 4d 65 6d 62 65 72 3e 6b 5f 5f 42 <BoolMember>k__B 00a0: 61 63 6b 69 6e 67 46 69 65 6c 64 1a 3c 49 6e 74 ackingField.<Int 00b0: 4d 65 6d 62 65 72 3e 6b 5f 5f 42 61 63 6b 69 6e Member>k__Backin 00c0: 67 46 69 65 6c 64 00 00 01 08 02 00 00 00 01 10 gField.......... 00d0: 27 00 00 0b '...对于类对象直接进行二进制序列化后的结果与远程调用场景二进制序列化的结构有所不同。
按照[MS-NRBF]所言,序列化后的结果首先是序列化数据头,其中包含RecordTypeEnum、TopId、HeaderId、MajorVersion和MajorVersion。这之后就是被序列化的类的一些信息,包括程序集、类名、属性和属性对应的值。
Binary Serialization Format SerializationHeaderRecord: RecordTypeEnum: SerializedStreamHeader (0x00) TopId: 1 (0x1) HeaderId: -1 (0xFFFFFFFF) MajorVersion: 1 (0x1) MinorVersion: 0 (0x0) Record Definition: RecordTypeEnum: SystemClassWithMembers (0x02) ClassInfo: ObjectId: (0x4e000000) LengthPrefixedString: Length: 78 (0x4e) String: BinarySerializePractise, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ObjectId: (0x00000001) LengthPrefixedString: Length: 32 (0x20) String: BinarySerializePractise.MyObject MemberCount: 2(0x00000002) LengthPrefixedString: Length: 27(0x1b) String: <BoolMember>k__BackingField LengthPrefixedString: Length: 26(0x1a) String: <IntMember>k__BackingField ObjectId:0x08010000 Length:0x00000002 Value:1(0x01) Value:10000(0x00002710) MessageEnd: RecordTypeEnum: MessageEnd (0x0b) 七 总结二进制序列化和反序列化虽然是目前使用的微服务的主要数据处理方式,但是对于开发人员来说这部分内容比较神秘,对于序列化数据和反序列化机制不甚了解。本文中通过一次事故的分析过程,梳理总结了反序列化机制,反序列化兼容性,序列化数据结构等内容,希望通过本文的一些知识,能够消除对于二进制序列化的陌生感,增进对于二进制序列化的深入认识。
八 参考资料Some gotchas in backward compatibility
版本容错序列化
[MS-NRBF]: .NET Remoting: Binary Format Data Structure
[MS-NRBF]: 3 Structure Examples