由于"类型错误:不可哈希类型:'字节数组'"而被截断的消息(在树莓派中)



我只在Raspberry Pis:"TypeError: unhashable type: 'bytearray'"中收到这些错误

  • Python 3.5.3
  • 树莓伸展9.1
  • 以下软件包:grpcio(1.6.3)grpcio反射(1.6.3)grpcio工具(1.6.3)

test.proto(非常简单):

syntax = "proto3";
package bug;
message Foo
{
string field1 = 1;
}

和Python代码:

from test_pb2 import Foo
EXPECTED = bytearray(b'nx04AAAA')
foo = Foo()
foo.field1 = 'AAAA'
print(foo)
data = foo.SerializeToString()
print(data)
assert (data == EXPECTED)
foo.ParseFromString(EXPECTED)
assert (foo.field1 == 'AAAA')

反序列化只在Raspberry Pi中失败(Ubuntu很好):

field1:"AAAA">

Traceback(最近一次通话):文件"/home/pi/.local/lib/python3.5/site packages/google/protobuf/internal/python_message.py",第1069行,在MergeFromString中如果是自己_InternalParse(序列化,0,长度)!=length:文件"/home/pi/.local/lib/python3.5/site packages/google/protobuf/internal/python_message.py",第1092行,在InternalParse中field_decoder,field_desc=decoders_by_tag.get(tag_bytes,(None,None))类型错误:不可更改的类型:"字节数组">

在处理上述异常的过程中,发生了另一个异常:

Traceback(最后一次调用):文件"test.py",第13行,位于foo。ParseFromString(REF)文件"/home/pi/.local/lib/python3.5/site packages/google/protobuf/message.py",第185行,在ParseFromString中自己MergeFromString(序列化)文件"/home/pi/.local/lib/python3.5/site packages/google/protobuf/internal/python_message.py",第1075行,在MergeFromString中提升message_mod。解码错误('Truncated message.')谷歌.protobuf.message.DecodeError:截断的消息。

我设法解决了Raspberry Pi中的问题。

问题是,当在Pi中运行时,bytearray的反序列化失败,但是,如果数据以bytes的形式传递,则一切正常。

所以我目前的解决方法是做一些类似的事情:

foo.ParseFromString( bytes(EXPECTED) )

我仍然不确定为什么同样的问题没有发生在台式机上。我注意到,当在桌面上调试时,foo.ParseFromString显示为<built-in method ParseFromString of Foo object at 0x7fedcc0b3fa8>,所以我认为桌面上有一些本机优化在Pi中运行时不可用。

当我有更多的时间时,我会尝试更多地研究protobuf是如何部署的。也许在此期间,有人可以分享一些细节。

最新更新