Python 从协议缓冲区创建数据表
各位晚上好, 我被卡住了,不知道该怎么办。我有一个应用程序,其中我将协议缓冲区消息中的数据存储在每个消息的数据表中。为此,我需要获取每个列的字段名。对于枚举字段,我使用这些值创建另一个DataTable,并将所有这些表放入单个消息的数据集中。下面是我执行此操作的工作代码:Python 从协议缓冲区创建数据表,python,datatable,protocol-buffers,Python,Datatable,Protocol Buffers,各位晚上好, 我被卡住了,不知道该怎么办。我有一个应用程序,其中我将协议缓冲区消息中的数据存储在每个消息的数据表中。为此,我需要获取每个列的字段名。对于枚举字段,我使用这些值创建另一个DataTable,并将所有这些表放入单个消息的数据集中。下面是我执行此操作的工作代码: def makeMessageTables(self, messageType): # Instance variable for the message DataSet self.messa
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;
}
我在VisualStudio中使用IronPython 2.7
如果有人能把我引向正确的方向,我将不胜感激
谢谢,
Robert Hix我在Java中只使用了协议缓冲区,因此我只能给出高级提示。希望有人对python中的协议缓冲区有更多的了解 每个消息都有一个定义,在每个消息中定义了每个字段。这与原始文件非常相似 以下是我使用的原型文件:
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;
}
以下是Java中使用的字段定义:
您似乎正在编写一个通用实用程序,因此对于将来的参考,协议消息可能要复杂得多,例如消息可以在消息中定义
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;
}