(这是我在RSS中看到的一个问题的重新发布,但是被OP删除了。我重新添加了它,因为我已经在不同的地方多次问过这个问题; Wiki表示“很好形成”)
突然,我ProtoException在反序列化时收到一个消息,消息是:未知导线类型6
ProtoException
首先要检查的是:
输入数据是原始数据吗?如果您尝试解析其他格式(json,xml,csv,二进制格式化程序)或仅是损坏的数据(例如,“内部服务器错误” html占位符文本页面),那么 它将不起作用 。
什么是线型?
它是一个3位标记,告诉它(广义而言;毕竟只有3位)下一个数据的外观。
协议缓冲区中的每个字段都以标头作为前缀,该标头告诉它表示哪个字段(数字)以及接下来要传输的数据类型。这种“什么类型的数据”对于支持流中 意外 数据的情况至关重要 (例如,您已经在数据类型的一端添加了字段),因为它使序列化程序知道如何读取该数据。数据(或根据需要将其存储为往返)。
有哪些不同的线型值及其说明?
double
long
ulong
byte[]
float
int
uint
我怀疑是字段引起问题,如何调试呢?
您要序列化到文件吗?在 最有可能的 原因(在我的经验)是已覆盖现有文件,但还没有被截断它; 即 是 200字节;您已经重写了它,但是只有182个字节。现在,流的末尾有18个字节的垃圾将其绊倒。重写协议缓冲区时,文件必须被截断。您可以使用FileMode:
FileMode
using(var file = new FileStream(path, FileMode.Truncate)) { // write }
或者SetLength 在 写入数据后:
SetLength
file.SetLength(file.Position);
其他可能原因
您正在(意外地)将流反序列化为与序列化的类型不同的类型。值得仔细检查对话双方,以确保不会发生这种情况。