c# - 重命名基础 ProtoBuf.Net 类后反序列化一个 protobuf 序列化数据;
问题描述
我的应用程序的旧版本中有以下类。
FooBase.cs
[ProtoContract]
[ProtoInclude(1, typeof(Baz)]
[ProtoInclude(3, typeof(Qux)]
public abstract class FooBase
{
[ProtoMember(5)]
public int Bar { get; set;}
}
Baz.cs
[ProtoContract]
public class Baz : FooBase
{
[ProtoMember(1)]
public string Quux {get;set;}
}
Qux.cs
[ProtoContract]
public class Qux : FooBase
{
[ProtoMember(1)]
public string Corge {get;set;}
}
现在我们有一些使用 Protobuf.Net 序列化的Bar
数据Qux
现在,在下一个版本中,我们决定让序列化成为可能 FooBase
。所以,FooBase
不再是一个抽象类。
我真的很想重命名FooBase
为Foo
问题是,如果我重命名FooBase
为Foo
,
Foo.cs
[ProtoContract]
[ProtoInclude(1, typeof(Baz)]
[ProtoInclude(3, typeof(Qux)]
public class Foo
{
[ProtoMember(5)]
public int Bar { get; set;}
}
是否仍然可以将我的旧数据反序列化为Baz
and Qux
?
我无法从可用文档中找到任何答案。
解决方案
在二进制协议级别,protobuf 不谈论名称;它专门谈论数字。如果您使用代码优先,您可以整天更改名称- 没关系。您可以序列化Foo
和反序列化为NewFooFinal3
- 很好。只是不要改变数字。
(警告:除非您使用 v2 中的“动态类型”功能,这些功能在 v3 中已弃用)
推荐阅读
- neo4j - 当关系也有一些信息是节点时,设计neo4j图的最佳方法是什么
- java - 解析模板 [] 时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问
- powershell - 从 csv 更改远程服务器的密码
- javascript - 内容不显示在 Internet Explorer Web 浏览器中
- python - 如何使 numxepr 与 complex64 一起运行?
- javascript - 如果我们将 3 个参数传递给在 JavaScript 中用 2 个参数声明的函数,为什么我们不会出错
- batch-file - 如何仅将 cmd 中的特定文件移动到另一个文件夹?
- java - 为什么 Full GC 不能释放一些内存,但 JVMTI 触发的 ForceGarbageCollection 可以
- python - 类对象的Python内置函数?
- regex - 需要使用带有脚本标签的正则表达式检测 googletagmanager 文本