2

我在 C# 中使用 Google.Protobuf 3.2.0 实现。我试图让它从池中分配对象。这样做的原因是它们需要通过队列传递给另一个线程进行处理,并且我希望我的应用程序在稳定运行状态下是无垃圾的

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

例如,使用以下 proto 文件:

syntax = "proto3"
message SimpleMessage {
    int32 number = 1;
}

我可以实现一个自定义解析器:

var parser = new MessageParser<SimpleMessage>(() => 
             {
                 // allocate from pool
                 return pool.GetObject();
             });
parser.ParseDelimitedFrom(stream)

每次它需要一个新对象时它都会调用委托,所以我可以实现一个池。

但是如何为具有嵌套成员的复合对象执行此操作?

syntax = "proto3"
message CompoundMessage {
    oneof Alternatives {
        SimpleMessage1 simple1 = 1;
        SimpleMessage2 simple2 = 2;
    }
}

我可以为 CompoundMessage 创建顶级自定义解析器,但是如何更改它用于创建嵌套对象的解析器(或工厂)?

4

0 回答 0