c# - Protocol Buffer .net : how to handle inheritance without [ProtoInclude]

标签 c# serialization protocol-buffers protobuf-net

我正在使用 Protobuf.net 序列化一些类。我希望能够序列化 SuperHero 类(如下),而不必在基类上指定 [ProtoInclude]。这是因为派生类是自动生成的,而基类不是,所以基类不直接知道它的派生类。

    [ProtoContract]
    class Person
    {
        [ProtoMember(1)]
        public int Id { get; set; }
        [ProtoMember(2)]
        public string Name { get; set; }
    }

    [ProtoContract]
    class SuperHero : Person
    {
        [ProtoMember(3)]
        public string Powers { get; set; }
    }

我使用的是最新版本的 protobuf.net。

最佳答案

首先要注意:在某些时候,您的代码必须知道子类 - 可能通过配置。重要的是,以某种方式您能够可靠地为每个子类型重现数字。如果您将数据存储到磁盘等,则在运行时发现类型时增加计数器是不够的,因为下次运行时您可能找不到相同顺序的类型。所以;让我们假设通过某种机制您有一个唯一的正整数,将 SuperHero 表示为 Person 的子类:

int tag = 7; // why not
Type subType = typeof(SuperHero);

然后,将此子类型告知 protobuf-net:

RuntimeTypeModel.Default.Add(typeof(Person), true).AddSubType(tag, subType);

这等同于属性处理代码在看到 [ProtoInclude(...)] 时所做的事情

关于c# - Protocol Buffer .net : how to handle inheritance without [ProtoInclude],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11869467/

相关文章:

java - 我想写入和读取文件,当我运行 : java. io.EOFException 时出现此错误

ios - 在 iOS Phonegap 应用程序上序列化文件传输

c++ - 在 jetson tx2 上升级 protobuf tensorflow

c# - 如何通过 HTTP GET ASP.NET C# 获取链接中的参数

c++ - 在 C++ 中向/从二进制文件写入/读取结构

c# - MySql Server中将两个表的数据写入一个xml文件中

c++ - 将 protobuf 消息拆分到多个输出缓冲区

c - 没有回调的 Nanopb

C# HTML 字符串 -> 获取没有 html 的长度

c# - Fluent NHibernate - 应用自定义类型的约定