我有一个存储和操作某些实体的类。根据输入的数量,我可能无法将实体存储在内存中,因此我尝试使用协议缓冲区将我的对象序列化以写入硬盘。我正在使用C#和protobuf-csharp-port。我知道protobuf-net是另一个端口;到目前为止,我一直在使用第一个选项,但如果需要根据我的需要我可以进行更改。
要以其简化形式序列化的类如下:
class Entity<T> where T: IComparable<T>
{
int id;
T metaData;
}
所以在编译时我没有关于metaData
的线索。谷歌搜索我注意到扩展是正确的路径(如google's page和this question所示);因此,我正在为类Entity.proto
定义Entity
文件,如下所示:
message Entity
{
required int32 id = 1 [default = 0];
extensions 2 to max;
}
我希望用户为.proto
提供自己的T
文件,而无需访问或重新编译Entity.proto
。在这方面,我的问题是:
Entity.proto
?T.proto
应该是什么?T
?答案 0 :(得分:3)
使用该方案,任何扩展都将是非通用Entity
的子值(不是子类)。这听起来不像泛型,但最终存储(序列化)通常与实现(Entity<T>
等)完全不同。如果你可以在他们之间手动:好。但这不是图书馆提供的东西,AFAIK。
为了完整性,在protobuf-net术语中:Entity<T>
完全没问题 - 它基本上认为每个(Entity<Foo>
,Entity<Bar>
等)都是完全独立的消息。 Protobuf-net并没有受到.proto模式的极大推动(虽然提供了代码生成工具,但是它完全没有) - 它主要使用运行时元数据。