如何从protobuf-net传输的数据中获取正确的结果

问题描述

我正在用c#进行编程,需要接收第三方数据(字节)。我只知道这些数据(字节)是通过protobuf-net发送的,但是我不知道它的结构(合同)是什么。

由于您不了解他的数据结构(合同),因此无法通过以下方式获取数据

ProtoBuf.Serializer.Deserialize(ms);

我想将此数据(字节)转换为字符串,并且尝试使用Encoding.UTF8.GetString(bytes);,但结果是乱码。

如何在不知道其结构(合同)的情况下将字节转换为正确的数据?

解决方法

忘记UTF8.GetString-此处无济于事;如果您有有效载荷但没有模式,那么最好的办法是查找-通过询问提供数据的人。下一个最好的选择可能是结合使用tools like protogen和有效数据的知识(只有您拥有;我只能对有效载荷的架构进行逆向工程)猜)。

从根本上讲,问题是protobuf二进制格式严重超载;完全相同的字节可能意味着非常不同的事物,具体取决于上下文(来自架构)。但是,我经常帮助人们为他们没有定义的数据重建模式,因此绝对可以做到。

如果仅通过链接工具很难做到这一点,我可能会提供更多帮助,但是我需要查看数据

- 解码注释中的有效负载,类似这样的方法应该起作用-所有标识符(名称)都是纯猜测的:

[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public int Id {get;set;}

    [ProtoMember(2)]
    public string Name {get;set}

    [ProtoMember(6)]
    public Bar Bar {get;set;}
}
[ProtoContract]
public class Bar {
    // Note this could also be a decimal under
    // Compat level 300 in protobuf-net v3
    [ProtoMember(2)]
    public string A {get;set;}
    // Repeat for fields 4,5,6,7,8,9,10
}

然后

var obj = Serializer.Deserialize<Foo>(source);