C# 使用协议缓冲区模拟泛型

C# 使用协议缓冲区模拟泛型,c#,generics,protocol-buffers,protobuf-net,C#,Generics,Protocol Buffers,Protobuf Net,我有一个类存储和操作一些实体。根据输入的数量,我可能无法在内存中存储实体,因此我尝试使用协议缓冲区将要写入硬盘的对象序列化。我用的是C#and。我知道作为一个替代港口;到目前为止,我一直在使用第一个选项,但如果需要的话,我愿意根据我的需要进行更改 要以简化形式序列化的类如下所示: class Entity<T> where T: IComparable<T> { int id; T metaData; } 我希望用户为T提供自己的.proto文件,而无需

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

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

class Entity<T> where T: IComparable<T>
{
    int id;
    T metaData;
}
我希望用户为
T
提供自己的
.proto
文件,而无需访问或重新编译
实体.proto
。在这方面,我的问题是:

  • 我是否需要更改
    实体.proto
  • 什么应该是
    T.proto
  • 如何在我的C#code中访问
    T

  • 使用该方案,任何扩展都将是非泛型
    实体
    的子值(而不是子类)。这听起来不像泛型,但最终存储(序列化)通常与实现(实体等)大不相同。如果你能在他们之间手动跳跃:好的。但这不是图书馆能提供的东西,好吧


    为了完整性,在protobuf net术语中:
    实体
    ——它基本上认为每个(
    实体
    实体
    ,等等)都是完全独立的消息。Protobuf-net并不是以.proto模式为动力的(尽管为了完整起见提供了一个代码生成工具)-它主要使用运行时元数据。

    如果我错了,请纠正我:Protobuf-net支持泛型,然后我可以用
    实体和它的序列化程序(1)编译我的库。在使用库时,用户还将与
    T
    一起提供它的序列化程序(2)。最终,
    Entity
    的一个实例将使用(1)和(2)进行序列化。@hamed在使用protobuf net时,最常见的情况是,您根本不分发序列化程序:库在需要时会担心这一点。您发布序列化程序的主要时间是针对AOT设备,可能与OOP混合太多,但我完全搞不懂<代码>实体
    不知道
    t
    ,因此无法序列化它。另一方面,
    T
    不知道
    实体
    的数据结构,因此也不能提供序列化。然后我想知道
    Entity
    是如何序列化的?@Hamed因为
    Entity
    T
    都不负责序列化。该库是-它看到的只是封闭的泛型类型
    实体
    。坦白地说,它甚至懒得检查它是否是通用的——因为这根本不重要。这就解释了。我的怀疑被提出,因为我试图解释
    .proto
    方案中的所有内容,其中
    实体在库构建时生成并编译proto,而
    T
    proto生成并连接到它。
    message Entity
    {
        required int32 id = 1 [default = 0];
        extensions 2 to max; 
    }