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