Google.protobuf,反序列化后,得到的是object,如何再统一转换成对应的数据类型
时间: 2023-06-26 21:10:07 浏览: 227
反序列化后得到的是一个 Protobuf 对象,可以通过对象的 getter 方法获取到对应的属性值。如果要将这些值转换为其他数据类型,可以使用对象的转换方法,例如:
- 对于基本数据类型,可以使用对象的 `getIntValue()`、`getLongValue()`、`getFloatValue()`、`getDoubleValue()` 等方法获取对应类型的值。
- 对于字符串,可以使用对象的 `getStringValue()` 方法获取字符串。
- 对于枚举类型,可以使用对象的 `getValue()` 方法获取枚举值。
- 对于嵌套的 Protobuf 对象,可以使用递归的方式将其转换为对应的数据类型。
需要根据具体的需求和 Protobuf 对象的定义来选择合适的转换方法。
相关问题
Google.protobuf,反序列化后,得到的是object,如何统一转换成对应的类型
在 Google.protobuf 中,可以通过使用 `DynamicMessage` 类来实现反序列化后的对象转换成对应的类型。
首先,需要定义一个 protobuf 的消息类型描述符(MessageDescriptor),可以通过以下方式创建:
```python
import google.protobuf.descriptor_pool as descriptor_pool
message_descriptor = descriptor_pool.Default().FindMessageTypeByName(proto_type_name)
```
其中,`proto_type_name` 为 protobuf 消息类型的名称。
然后,可以通过以下代码将反序列化得到的 `protobuf` 对象转换为对应类型的对象:
```python
from google.protobuf.json_format import MessageToDict
from google.protobuf.message import Message
def protobuf_to_object(protobuf: Message, message_descriptor: MessageDescriptor) -> object:
message_class = message_descriptor._concrete_class # 获取对应类型的类
message_dict = MessageToDict(protobuf, including_default_value_fields=True) # 将 protobuf 转换为字典
# 创建对应类型的对象
obj = message_class()
obj.ParseFromDict(message_dict)
return obj
```
其中,`MessageToDict` 函数用于将 protobuf 对象转换为字典,`_concrete_class` 属性用于获取对应类型的类,`ParseFromDict` 方法用于将字典转换为对应类型的对象。
最终,可以通过调用 `protobuf_to_object` 函数将反序列化得到的 `protobuf` 对象转换为对应类型的对象。
Google.protobuf,反序列化后,得到的是object,如何统一转换成对应的消息类型
在Google.protobuf中,反序列化后的结果是一个Python对象,可以通过该对象的`DESCRIPTOR`属性获取该消息类型的描述符,然后使用该描述符的`message_class`方法将该对象转换为对应的消息类型。
例如,假设我们有一个`Person`消息类型,可以按以下方式将反序列化的结果转换为该消息类型:
```python
from google.protobuf.descriptor import Descriptor
# 假设反序列化后得到的对象为person_obj
descriptor: Descriptor = person_obj.DESCRIPTOR
message_type = descriptor.message_class
person_message = message_type.FromString(person_obj.SerializeToString())
```
这里通过`person_obj.DESCRIPTOR`获取该对象对应的描述符,然后通过描述符的`message_class`方法获取该消息类型,最后使用该消息类型的`FromString`方法将该对象转换为对应的消息类型。
阅读全文
相关推荐
















