Protobug消息中的消息标识符

时间:2018-11-05 19:02:19

标签: c++ protocol-buffers

是否有一种方法可以获取protobuf消息的ID。

例如我有:

syntax = "proto3";

package protobuf;

message parameters_t
{
    string audio_device = 1;
}

message master_t
{
    enum type_t
    {
        unknown = 0;
        login_rsp = 1;
    }

    type_t type = 1;
}

我要在C ++中做的是通过网络发送大小,然后发送消息的某些ID和缓冲区。

例如paramters_t的ID为0(可静态访问),而master_t的ID为1,因此我可以在代码中进行操作:

if (id == protobuf::master_t::id) {
    ...
}
else if (id == protobuf::paramters_t::id) {
    ...
}

是否有任何方法可以在不手动分配值的情况下实现?我希望以某种方式在原型文件中进行设置。它可以是我定义自己的常量,我不在乎。

2 个答案:

答案 0 :(得分:1)

一种典型的方法是只定义一个枚举:

enum MsgId {
  MSGID_MASTER = 0;
  MSGID_PARAMETERS = 1;
}

然后您就可以像常量一样在C ++中访问它们。

答案 1 :(得分:0)

我现在要做的就是解决这个(可能不是很优雅)的解决方案,在每个消息中都放置一个枚举,如下所示:

<Window x:Class="WpfApp2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp2"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.Resources>
    <ObjectDataProvider x:Key="myEnumData"
            MethodName="GetValues" 
            ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:CType" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
<Grid>
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Models}">
        <DataGrid.Columns>
            <DataGridComboBoxColumn 
                Header="Enum"
                ItemsSource="{Binding Source={StaticResource myEnumData}, Mode=OneWay}"
                SelectedValueBinding="{Binding Path=Type}">
            </DataGridComboBoxColumn>

            <!--ComboBox for Persons-->
            <DataGridComboBoxColumn>

            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

每个邮件中都有这个枚举,但是enum pt { invalid = 0; packet_type = 3; } 带有另一个值。看起来像这样:

packet_type

这样做的优点是,我可以在模板中将其用于一个类,该类可以自动检测数据包类型并将其识别以将其提供给已注册的处理程序,因为可以通过syntax = "proto3"; package protobuf; message parameters_t { enum pt { invalid = 0; packet_type = 1; } string audio_device = 1; } message login_message_t { enum pt { invalid = 0; packet_type = 2; } enum process_type_t { invalid_process = 0; player = 1; display = 2; } process_type_t process_type = 1; uint32 player_id = 2; } message generic_message_t { enum pt { invalid = 0; packet_type = 3; } enum type_t { unknown = 0; login_done = 1; audio_init_success = 2; } type_t type = 1; } message error_message_t { enum pt { invalid = 0; packet_type = 4; } enum error_t { unknown = 0; could_not_init = 1; could_not_open_audio_device = 2; } error_t error = 1; bool critical = 2; } 访问该数据包以获取值