从协议缓冲区创建DataTable

时间:2014-12-09 20:41:08

标签: python datatable protocol-buffers

大家晚上好,

我被困住了,无法弄清楚该做什么。我有一个应用程序,我在每个消息的DataTable中存储来自协议缓冲区消息的数据。为此,我需要获取每个列的字段名称。对于作为枚举的字段,我使用这些值创建另一个DataTable,并将所有这些表放入单个消息的数据集中。以下是我的工作代码:

def makeMessageTables(self, messageType):

        # Instance variable for the message DataSet
        self.messageDataSet = DataSet()

        ###################################################################
        # Create a table in the DataSet to hold the message structure.
        ###################################################################
        messageTable = DataTable()

        messageTable.TableName = 'messageTable'

        # Construct columns in the table to correspons with the message fields.
        messageFields = messageType.DESCRIPTOR.fields
        for field in messageFields:
            messageTable.Columns.Add(field.name)

        # Add the table to the DataSet
        self.messageDataSet.Tables.Add(messageTable)

        ###################################################################
        # Make a table for each field that has an enum type associated
        # with it.  The table has the display values and the storage 
        # values in it foe setting up the ComboBox in the DataGridView
        ###################################################################
        for field in messageFields:
            if field.enum_type != None:
                tableName = '{}_enumTable'.format(field.enum_type.name)
                enumTable = DataTable()
                enumTable.TableName = tableName;
                enumTable.Columns.Add('enumDisplay')
                enumTable.Columns.Add('enumValue')

                for value in field.enum_type.values:
                    newRow = enumTable.NewRow()
                    newRow['enumDisplay'] = value.name
                    newRow['enumValue'] = value.number
                    enumTable.Rows.Add(newRow)

                self.messageDataSet.Tables.Add(enumTable)

现在,今天我点击了一条包含子消息的消息。我想为每个子消息分别使用一个表。我遇到的问题是我不知道如何分解消息以从子消息中获取字段名称和其他信息。我提供了一个代表性的示例消息,就像我想在下面处理的那样。

message SystemOneStatusDetails
{
    required int32 field1 = 1;
        required int32 field1 = 1;
        required int32 field1 = 1;
        required int32 field1 = 1;
}

message SystemTwoStatusDetails
{
    required int32 field1 = 1;
        required int32 field1 = 1;
        required int32 field1 = 1;
        required int32 field1 = 1;
}

message StatusMessage
{
    repeated SystemOneStatusDetails sysOneStatus = 1;           

    repeated SystemTwoStatusDetails sysTwoStatus = 2;           
}

我在Visual Studio中使用IronPython 2.7。

如果有人能引导我朝着正确的方向前进,我会非常感激。

谢谢, 罗伯特希克斯

1 个答案:

答案 0 :(得分:0)

我只使用Java中的协议缓冲区,所以我只能提供高级提示。希望有人知道python中的协议缓冲区。

每条消息都有一个定义,每条消息中都定义了每个字段。它与proto文件非常相似。

这是我使用的原型文件:

message SystemOneStatusDetails
{
    required int32 field1 = 1;
    required int32 field2 = 2;
    required int32 field3 = 3;
    required int32 field4 = 4;
}

message SystemTwoStatusDetails
{
    required int32 field1 = 1;
    required int32 field2 = 2;
    required int32 field3 = 3;
    required int32 field4 = 4;
}

message StatusMessage
{
    repeated SystemOneStatusDetails sysOneStatus = 1;           

    repeated SystemTwoStatusDetails sysTwoStatus = 2;           
}

以下是Field-Definition(在Java中使用): enter image description here


您似乎在编写通用实用程序,因此对于将来的参考协议消息可能会复杂得多,例如:消息可以在消息中定义

message outer {
       message inner {
            ....
       } 

       required inner myInner = 1;

}

此外,您还可以将扩展程序添加到以下邮件中:

message Message {
    extensions 100 to max;

    required uint64 A = 1;
    required string name = 2;
}

message Event {
    extensions 100 to max;

    required uint64 B = 1;
    required string eventName = 2;

/*      assert_p('LineFrameTree.FileDisplay_JTbl', 'Content', '[[A, 1, , UINT64, 123, 123], [name, 1, , STRING, aa, aa]]') */
}

message Note {
    required string text = 1;
}


extend Message { 
    optional Event ext = 101; 
    repeated Note notes = 103; 
}