Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Google.Protobuf C中从池中分配复合对象#_C#_Protocol Buffers_Protobuf Csharp Port - Fatal编程技术网

C# 如何在Google.Protobuf C中从池中分配复合对象#

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&

我正在使用C#中的Google.protobuf3.2.0实现。我试图让它从池中分配对象。这样做的原因是,它们需要通过队列传递给另一个线程进行处理,我希望我的应用程序能够正常运行

对于一个简单的对象来说,这很容易

例如,使用以下原型文件:

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;
    }
}