Protobuf.NET utilisant

Besoin d’envoyer des données entre c # géré et c ++ non géré. Après quelques recherches, j’ai essayé d’utiliser Protobuf.NET.

Je ne suis pas sûr de comprendre les fonctionnalités de ProtoBuf …

  1. Construire une définition de type dans Proto. J’ai besoin de cette définition de type dans les projets c ++ et c #
  2. Utilisez l’outil de ligne de commande “protogen.exe” pour obtenir un fichier .cs et .cpp, .h à partir de la définition du type.
  3. Copiez les fichiers .cs dans mon projet c # et le fichier .cpp, .h dans ma solution c ++.

Semble que je suis trop stupide pour résoudre ce problème. Voici mon problème et mes questions.

  1. Est-il possible de définir le type dans c # pour générer les fichiers dans c ++?
  2. J’ai essayé d’utiliser l’outil de ligne de commande protogen.exe avec les fichiers suivants

test1.proto

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

test2.proto

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

Rien ne fonctionne pour moi. Vraiment tout essayé. J’ai mis les fichiers proto dans le répertoire en ligne de commande, j’ai essayé toutes les options pour définir le répertoire. Comment les construire facilement? Le deuxième fichier fonctionne avec l’outil de ligne de commande proto standard pour c ++, mais j’en ai aussi besoin pour c #. Vraiment besoin de votre aide.

Tout d’abord, notez que protobuf-net n’est qu’une implémentation disponible pour .NET; en tous cas…

“test1.proto” n’est pas un .proto – c’est C #; Il n’est pas nécessaire d’utiliser un .proto avec protobuf-net, mais dans votre scénario interop, c’est une très bonne idée. Il existe un plug-in VS2010 pour cela, ou bien l’outil protogen dans le zip protobuf-net:

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

Cela devrait générer test2.cs avec le contenu:

 //------------------------------------------------------------------------------ //  // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. //  //------------------------------------------------------------------------------ // 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 ssortingng _name; [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"name", DataFormat = global::ProtoBuf.DataFormat.Default)] public ssortingng name { get { return _name; } set { _name = value; } } private ssortingng _email = ""; [global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"email", DataFormat = global::ProtoBuf.DataFormat.Default)] [global::System.ComponentModel.DefaultValue("")] public ssortingng 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); } } } 

Notez qu’il existe des commutateurs supplémentaires si vous souhaitez, par exemple, tenter une normalisation de la casse (afin d’obtenir l’ Id , le Name , le Email , etc.) ou inclure un support supplémentaire pour le sérialiseur ( BinaryFormatter , DataContractSerializer , etc.).

test1.proto n’est pas un fichier .proto valide.

test2.proto air plutôt bien. Notez que vous aurez besoin du compilateur du projet principal protobuf pour générer le code C ++ et du compilateur de protobuf-net afin de générer le code C #. Je suppose que la plupart de vos problèmes viennent du fait que vous ne .proto pas que vous avez besoin de deux compilateurs différents (mais vous alimentez le même fichier .proto aux deux).

Bien que je ne connaisse pas grand chose de ProtoBuf, je sais qu’il existe un moyen plus simple de le faire. Si les classes ci-dessus représentent les données que vous essayez d’envoyer au C ++, utilisez simplement Sérialisation et sérialisez votre classe. Vous pouvez alors exporter les classes et les données dans un fichier XML. Vous pouvez ensuite utiliser XmlLite ou un autre lecteur XML pour lire vos classes et vos données. Vous pouvez même utiliser Boost pour lire dans les classes sérialisées.