在C#中解码没有模式的protobuf

时间:2019-07-13 11:15:10

标签: c# protobuf-net protobuf.js

我有下面的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                           @...{}

1 个答案:

答案 0 :(得分:0)

这里的问题是:protobuf是一种不明确的格式。相同的字节可能意味着非常不同的事物,这取决于仅在模式中已知的信息。例如,原始二进制(bytes)有效负载,文本字符串,子消息和“打包的”原始值都共享完全相同的标记。同样,对于大多数原始类型,有多种表示相同的 value 的方法,但是所有原始类型在编码方式上也是重叠的。

当然可以在没有模式的情况下抽象地解码数据-一切都可以视为未知字段,并且您可以通过API查询未知字段。但这仍然不能帮助您真正地解释数据,因为再次:您需要知道您的期望以应用正确的解码。

IMO,您最好的选择是对架构进行反向工程。您可以从https://protogen.marcgravell.com/decode开始以显示实际有效载荷包含的内容,然后从那里开始将其拼接在一起。