使用协议缓冲区模拟泛型

时间:2014-09-21 09:17:01

标签: c# generics protocol-buffers protobuf-net

我有一个存储和操作某些实体的类。根据输入的数量,我可能无法将实体存储在内存中,因此我尝试使用协议缓冲区将我的对象序列化以写入硬盘。我正在使用C#和protobuf-csharp-port。我知道protobuf-net是另一个端口;到目前为止,我一直在使用第一个选项,但如果需要根据我的需要我可以进行更改。

要以其简化形式序列化的类如下:

class Entity<T> where T: IComparable<T>
{
    int id;
    T metaData;
}

所以在编译时我没有关于metaData的线索。谷歌搜索我注意到扩展是正确的路径(如google's pagethis question所示);因此,我正在为类Entity.proto定义Entity文件,如下所示:

message Entity
{
    required int32 id = 1 [default = 0];
    extensions 2 to max; 
}

我希望用户为.proto提供自己的T文件,而无需访问或重新编译Entity.proto。在这方面,我的问题是:

  1. 我是否需要更改Entity.proto
  2. T.proto应该是什么?
  3. 如何在我的C#代码中访问T

1 个答案:

答案 0 :(得分:3)

使用该方案,任何扩展都将是非通用Entity子值(不是子类)。这听起来不像泛型,但最终存储(序列化)通常与实现(Entity<T>等)完全不同。如果你可以在他们之间手动:好。但这不是图书馆提供的东西,AFAIK。

为了完整性,在protobuf-net术语中:Entity<T>完全没问题 - 它基本上认为每个(Entity<Foo>Entity<Bar>等)都是完全独立的消息。 Protobuf-net并没有受到.proto模式的极大推动(虽然提供了代码生成工具,但是它完全没有) - 它主要使用运行时元数据。