2012-01-29 1 views
5

Я собираюсь приступить к проекту для подключения двух программ: одного в C# и одного на C++. У меня уже есть работающая программа C#, которая способна разговаривать с другими версиями. Прежде чем начать с версии C++, я подумал о некоторых проблемах:Буферы протокола, получая C# для общения с C++: проблемы с типом и проблемы схемы

1) Я использую protobuf-net v1. Я считаю, что файлы .proto из сериализатора - это именно то, что требуется в качестве шаблонов для версии C++? В google-поиске упоминалось что-то о корпусе паскаля, но я понятия не имею, важно ли это.

2) Что делать, если один из типов .NET не имеет прямого аналога в C++? Что делать, если у меня есть десятичный или словарь? Нужно ли мне каким-либо образом модифицировать .proto-файлы и хлюпать данные в другую форму? (Я рассмотрю файлы и посмотрю, смогу ли я это выяснить)

3) Есть ли какие-либо другие ошибки, о которых люди могут подумать? Бинарные форматы и тому подобное?

EDIT Теперь я посмотрел на один из прото-файлов. Кажется, что .NET специфический материал помечен, например, bcl.DateTime или bcl.Decimal. Подтипы включены в определения прото. Однако я не уверен, что делать с типами bcl. Если моя C++ prog видит десятичную, что она будет делать?

ответ

4
  1. Да, прото-файлы должны быть совместимы. Оболочка - это соглашения, которые не должны влиять на фактическую функциональность - только сгенерированный код и т. Д.

  2. Это не так, если в .NET есть сопоставимый тип, что важно - это то, поддерживают ли буферы протокола тип, который это важно. Буферы протокола в основном довольно примитивны - если вы хотите создать что-либо большее, вам нужно будет создать свои собственные сообщения.

  3. Точка буферов протокола, чтобы сделать все это бинарное совместимы на проводе, так что на самом деле не должны быть подводные камни ... читать документацию, чтобы узнать о версионности политики и т.д. Единственное, что я могу подумайте о том, что, по крайней мере, в версии Java рекомендуется создавать необязательные поля enum, а сам тип перечисления - нулевое значение «неизвестно», которое будет использоваться, если вы попытаетесь десериализовать новое значение, которое не является поддерживается в десериализационном коде.

3

Некоторые незначительные дополнения к пунктам Йона:

  • Protobuf-сеть v1 действительно есть Getaproto, который может помочь с отправной точкой, однако, в целях взаимодействия с другими программами я бы рекомендовал, начиная с .proto; protobuf-net может работать, это было слишком, либо через «protogen», либо через VS addin
  • , кроме этого, у вас не должно быть проблем, если вы не хотите обрабатывать все файлы как двоичные; открытие файлов в текстовом режиме вызовет горе
+0

Я не уверен, что такое различие? Я использовал Serializer.GetProto , чтобы получить строку, которая была прекрасно читаема и выглядит как .proto-файл. – Carlos