C# 如何在Google.Protobuf C中从池中分配复合对象#
我正在使用C#中的Google.protobuf3.2.0实现。我试图让它从池中分配对象。这样做的原因是,它们需要通过队列传递给另一个线程进行处理,我希望我的应用程序能够正常运行 对于一个简单的对象来说,这很容易 例如,使用以下原型文件:C# 如何在Google.Protobuf C中从池中分配复合对象#,c#,protocol-buffers,protobuf-csharp-port,C#,Protocol Buffers,Protobuf Csharp Port,我正在使用C#中的Google.protobuf3.2.0实现。我试图让它从池中分配对象。这样做的原因是,它们需要通过队列传递给另一个线程进行处理,我希望我的应用程序能够正常运行 对于一个简单的对象来说,这很容易 例如,使用以下原型文件: syntax = "proto3" message SimpleMessage { int32 number = 1; } 我可以实现一个自定义解析器: var parser = new MessageParser<SimpleMessage&
syntax = "proto3"
message SimpleMessage {
int32 number = 1;
}
我可以实现一个自定义解析器:
var parser = new MessageParser<SimpleMessage>(() =>
{
// allocate from pool
return pool.GetObject();
});
parser.ParseDelimitedFrom(stream)
我可以为CompoundMessage创建顶级自定义解析器,但如何更改它用于创建嵌套对象的解析器(或工厂?这可能对您有帮助,也可能没有帮助,但protobuf net(不同的库)允许为任何类型设置工厂方法-工厂方法当前需要是静态方法,可以选择采用
SerializationContext
,StreamingContext
(用于传输共享状态-可以向序列化/反序列化调用提供ctx)和/或Type
作为参数-并返回object
或该用法所需类型的对象。未发布的protobuf net代码通过一个新的完全外部序列化程序方法概念扩展了这一点,该方法允许完全控制读取器等。感谢Marc,这听起来很理想。不幸的是,我们最近将代码从proto2(使用protobuf-net)移植到了proto3(使用google.protobuf),因为protobuf-net似乎不支持proto3。事后看来,我应该先检查一下:-)承认;注意我确实想添加proto3支持,但是。。。对它的需求似乎很低,DSL工具从来都不是protobuf net的强项;奇怪的是,我最大的担忧是试图以一种完全跨平台的方式为.NETCore工作;现有的protogen执行protoc
,这对于x-plat来说是一个棘手的问题。想找点时间在.NETCore上玩一下antlr或类似的软件,看看我们能做些什么
syntax = "proto3"
message CompoundMessage {
oneof Alternatives {
SimpleMessage1 simple1 = 1;
SimpleMessage2 simple2 = 2;
}
}