Source code for obci.core.messages.protobuf_serializer


from obci.core.messages import Message, MessageSerializer
from obci.configs import variables_pb2 as proto


[docs]class ProtobufMessageSerializerBase(MessageSerializer): """ Serializer for protobuf objects. Deserializer will be created dynamically using `gen_deserialize_func` function. """ @staticmethod
[docs] def serialize(data): return data.SerializeToString()
@staticmethod
[docs] def deserialize(data): raise Exception("must be implemented in derived classes")
[docs]def gen_deserialize_func(ProtoClass): """ Generate deserialize for specified protobuf class. :param ProtoClass: protobuf class :return: deserializer function """ def deserialize(data): obj = ProtoClass() obj.ParseFromString(data) return obj return deserialize
[docs]def generate_protobuf_serializer(proto_class): """ Generate serializer for specified protobuf class. """ return type('{}_{}'.format(proto_class.__name__, 'ProtobufMessageSerializer'), (ProtobufMessageSerializerBase,), {'deserialize': staticmethod(gen_deserialize_func(proto_class))})
[docs]def register_serializers() -> None: """ Register serializers for all protobuf objects. """ for proto_name in proto.DESCRIPTOR.message_types_by_name.keys(): Message.register_serializer(proto_name, generate_protobuf_serializer(getattr(proto, proto_name)))
register_serializers()