Использование Protobuf.NET - PullRequest
2 голосов
/ 21 июля 2011

Необходимо отправить некоторые данные между управляемым c # и неуправляемым c ++.После некоторых исследований я попытался использовать Protobuf.NET.

Я не уверен, что понимаю функциональность ProtoBuf ...

  1. Создание определения типа в Proto.Мне нужно это определение типа в обоих проектах c ++ и c #
  2. Используйте инструмент командной строки "protogen.exe", чтобы получить файл .cs и .cpp, .h из определения типа
  3. Скопируйте файлы .cs в мой проект c # и .cpp, .h в моем решении c ++.

Кажется, я глуп, чтобы решить эту проблему.Вот моя проблема и вопросы.

  1. Можно ли определить тип в c # для создания файлов для c ++?
  2. Попытался использовать инструмент командной строки protogen.exeсо следующими файлами

test1.proto

using ProtoBuf;
namespace ProtocolBuffers
{
    [ProtoContract]
    class Person
    {
        [ProtoMember(1)]
        public int Id {get;set;}
        [ProtoMember(2)]
        public string Name { get; set; }
    }
}

test2.proto

message Person {
  required int32 id = 1;
  required string name = 2;
  optional string email = 3;
}

Ничто не работает для меня.Действительно все перепробовал.Я поместил файлы прототипов в директорию командной строки, попробовал каждый параметр, чтобы установить директорию.Как их легко построить?Второй файл работает со стандартным инструментом командной строки Proto для C ++, но он мне тоже нужен для C #.Очень нужна ваша помощь.

Ответы [ 3 ]

4 голосов
/ 21 июля 2011

Во-первых, обратите внимание, что protobuf-net - это просто одна доступная реализация для .NET;в любом случае ...

"test1.proto" - это не .proto - это C #;.proto не требуется для использования с protobuf-net, но в вашем сценарии взаимодействия это очень хорошая идея.Для этого есть плагин VS2010, или, альтернативно, инструмент protogen, который находится в zip protobuf-net:

 protogen -i:test2.proto -o:test2.cs

Это должно сгенерировать test2.cs с содержимым:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

// Generated from: test2.proto
namespace test2
{
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"Person")]
  public partial class Person : global::ProtoBuf.IExtensible
  {
    public Person() {}

    private int _id;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"id", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
    public int id
    {
      get { return _id; }
      set { _id = value; }
    }
    private string _name;
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"name", DataFormat = global::ProtoBuf.DataFormat.Default)]
    public string name
    {
      get { return _name; }
      set { _name = value; }
    }

    private string _email = "";
    [global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"email", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue("")]
    public string email
    {
      get { return _email; }
      set { _email = value; }
    }
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }

}

Обратите внимание, что есть дополнительные переключатели, если вы хотите, например, попытаться нормализовать регистр (таким образом, вы получаете Id, Name, Email и т. Д.) Или хотите включить дополнительную поддержку сериализатора (BinaryFormatterDataContractSerializer и т. Д.)

2 голосов
/ 21 июля 2011

test1.proto не является допустимым .proto файлом.

test2.proto выглядит довольно хорошо.Обратите внимание, что вам понадобится компилятор из основного проекта protobuf для генерации кода C ++ и компилятор из protobuf-net для генерации кода C #.Я полагаю, что большинство ваших проблем связано с тем, что вы не понимаете, что вам нужны два разных компилятора (но вы передаете один и тот же файл .proto обоим).

0 голосов
/ 21 июля 2011

Хотя я не знаю много о ProtoBuf, я знаю, что есть более простой способ сделать это. Если указанные выше классы представляют данные, которые вы пытаетесь отправить в C ++, просто используйте Сериализация и сериализуйте свой класс, тогда вы можете вывести классы и данные в файл XML. Затем вы можете использовать XmlLite или какой-либо другой XML-ридер для чтения ваших классов и данных. Вы даже можете использовать Boost для чтения в сериализованных классах.

...