如何在使用C#protobuf-net生成的c ++中反序列化“Serialized Protobuffer”

时间:2013-03-08 12:10:20

标签: c# c++ protocol-buffers protobuf-net

我有一个结构

[ProtoContract]
    public struct TenprintTemplateStructure
    {
        [ProtoMember(1)]
        public byte[] FeatureTenprint { get; set; } //Tenpritn NTemplate's NBuffer

        [ProtoMember(2)]
        public int TemplateID { get; set; } //Template ID

        [ProtoMember(3)]
        public long TemplateSize { get; set; } //Template Size

        [ProtoMember(4)]
        public string PersonID { get; set; } //Person ID

        [ProtoMember(5)]
        public int IsActive { get; set; } // Person's Status
    };

我正在使用长度前缀为Fixed32的c#proto-buf将此结构的多个实例序列化到一个文件中。代码如下,(tenprintTemplateStruct是struct im writing)

ProtoBuf.Serializer.SerializeWithLengthPrefix(stream, tenprintTemplateStruct, ProtoBuf.PrefixStyle.Fixed32, 0);

我知道它可以使用c ++反序列化。我尝试了一些解决方案,但还没有成功。

以前有人这样做过吗?

1 个答案:

答案 0 :(得分:3)

在C ++方面,您需要执行4个步骤:

  • 使用protoc工具生成C ++代码;您可以手动编写.proto架构,也可以使用string proto = Serializer.GetProto<TenprintTemplateStructure>();(来自.NET代码)作为起点
  • 从输入中读取4个字节并将其解析为32位整数; Fixed32被记录为little-endian,所以:那样做
  • 用这个长度的长度限制流包裹你的实际流;谷歌为此提供LimitingInputStream
  • 按照C++ guide进行实际反序列化 - 主要是ParseFromIstream