重命名ProtoBuf.Net基类FooBase为Foo后 原有Baz/Qux序列化数据能否反序列化
结论
你完成修改后完全可以正常反序列化旧的Baz、Qux类型序列化数据,父类重命名、移除abstract修饰符的操作不会影响历史数据兼容性。
原因说明
ProtoBuf.Net的序列化逻辑完全基于你通过Attribute声明的元数据,和.NET类型本身的名称、是否为抽象类无关:
- 序列化Baz或Qux实例时,生成的二进制数据中只会存储三类信息:
[ProtoInclude]配置的继承标记编号、各属性对应的[ProtoMember]字段编号、字段的实际值,不会写入父类的类名信息。 - 你本次的修改没有改动任何核心序列化配置:
[ProtoInclude]中1对应Baz、3对应Qux的映射关系没有变化,父类Bar属性的[ProtoMember(5)]配置没有变化,Baz、Qux自身的字段配置也没有变化。
注意事项
- 只需同步修改Baz和Qux的继承声明,将原先的继承自
FooBase改为继承自新的Foo类,保证代码正常编译即可,不需要额外做兼容处理。 - 注:你提到的「序列化得到的Bar和Qux类型数据」应该是笔误,Bar为父类的属性名,不存在Bar类型的序列化数据,如果你指的是Baz类型,上述结论完全成立。
内容的提问来源于stack exchange,提问作者Jins Peter
相关产品推荐
相关产品推荐

