Как десериализовать «Серийный протобуфер» в C ++, который генерируется с использованием C # 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
};

и я сериализовал несколько экземпляров этой структуры в файл, используя c # proto-buf с префиксом длины Fixed32. код ниже, (tenprintTemplateStruct — это структура, которую я пишу)

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

Я знаю, что это может быть десериализуемо, используя c ++. Я попытался какое-то решение, но пока не удалось.

кто-нибудь делал это раньше?

1

Решение

На стороне C ++ у вас есть 4 шага:

  • генерировать код C ++, используя protoc инструмент; Вы можете написать схему .proto вручную или использовать string proto = Serializer.GetProto<TenprintTemplateStructure>(); (из вашего кода .NET) в качестве отправной точки
  • прочитать ровно 4 байта из ввода и проанализировать его как 32-разрядное целое число; Fixed32 задокументировано как little-endian, так что: сделать это
  • оберните ваш реальный поток ограниченным по длине потоком этой длины; Google предоставляет LimitingInputStream за это
  • следовать Руководство по С ++ для фактической десериализации — в первую очередь ParseFromIstream
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]