首页 > 解决方案 > 重命名基础 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不再是一个抽象类。

我真的很想重命名FooBaseFoo 问题是,如果我重命名FooBaseFoo,

Foo.cs


[ProtoContract]
[ProtoInclude(1, typeof(Baz)]
[ProtoInclude(3, typeof(Qux)]
public class Foo
{
     [ProtoMember(5)]
     public int Bar { get; set;}
}

是否仍然可以将我的旧数据反序列化为Bazand Qux

我无法从可用文档中找到任何答案。

标签: c#protobuf-net

解决方案


在二进制协议级别,protobuf 不谈论名称;它专门谈论数字。如果您使用代码优先,您可以整天更改名称- 没关系。您可以序列化Foo和反序列化为NewFooFinal3- 很好。只是不要改变数字。

(警告:除非您使用 v2 中的“动态类型”功能,这些功能在 v3 中已弃用)


推荐阅读