我有下面的protobuf文本,并希望在C#中反序列化。我尝试了下面的代码,但它始终抛出错误'预期的类型不是,并且不能推断出任何合同:System.Object 。我知道我需要一个架构,有没有办法将protobuf文本数据转换为字符串或Json。我正在使用Marc Gavell库protobuf-net。
public void DeserializeProtobuf()
{
var path = $"../../protobufSingleEntry.txt";
byte[] byteArray = Encoding.UTF8.GetBytes(path);
MemoryStream stream = new MemoryStream(byteArray);
Serializer.Deserialize<object>(stream);
}
protobufSingleEntry.txt
00000000: 7e6d 7e37 357e 6d7e 0829 1247 0a0f 7173 ~m~75~m~.).G..qs
00000001: 5f67 554d 4463 7556 514e 6837 3912 0f42 _gUMDcuVQNh79..B
00000002: 494e 414e 4345 3a42 5443 5553 4454 1a02 INANCE:BTCUSDT..
00000003: 6f6b 293d 0ad7 a3b0 7cc6 4035 0ad7 73c3 ok)=....|.@5..s.
00000004: 3de1 7a04 c051 5c05 31d0 037d cc40 9a01 =.z..Q\.1..}.@..
00000005: 027b 7d7e 6d7e 3735 7e6d 7e08 2912 470a .{}~m~75~m~.).G.
00000006: 0f71 735f 4e7a 784f 7a4a 4d79 4277 6b6b .qs_NzxOzJMyBwkk
00000007: 120f 4249 4e41 4e43 453a 4254 4355 5344 ..BINANCE:BTCUSD
00000008: 541a 026f 6b29 3d0a d7a3 b07c c640 350a T..ok)=....|.@5.
00000009: d773 c33d e17a 04c0 515c 0531 d003 7dcc .s.=.z..Q\.1..}.
0000000a: 409a 0102 7b7d @...{}
答案 0 :(得分:0)
这里的问题是:protobuf是一种不明确的格式。相同的字节可能意味着非常不同的事物,这取决于仅在模式中已知的信息。例如,原始二进制(bytes
)有效负载,文本字符串,子消息和“打包的”原始值都共享完全相同的标记。同样,对于大多数原始类型,有多种表示相同的 value 的方法,但是所有原始类型在编码方式上也是重叠的。
当然可以在没有模式的情况下抽象地解码数据-一切都可以视为未知字段,并且您可以通过API查询未知字段。但这仍然不能帮助您真正地解释数据,因为再次:您需要知道您的期望以应用正确的解码。
IMO,您最好的选择是对架构进行反向工程。您可以从https://protogen.marcgravell.com/decode开始以显示实际有效载荷包含的内容,然后从那里开始将其拼接在一起。