2016-04-12 1 views
0

Je commence à travailler avec protobufs - J'ai un fichier proto:protobuf et .net - comment utiliser le fichier .cs généré?

syntax = "proto2"; 

message InputState { 
    required uint32 input = 1; 
    required string state = 2; 
} 

message InputStateData { 
    repeated InputState input = 1; 
} 

J'ai couru l'outil de ligne de commande (de protoc-3.0.0-alpha-3-win32)

Je suis ce fichier .cs inattendu: !click me! Input.cs

I inclus le NuGet protobuf-portable-net, mais maintenant je n'ai aucune idée comment utiliser le fichier .cs générés

Que dois-je faire - est l'entrée. fichier cs correct?

+0

Ajoutez le fichier à votre '.csproj' et utilisez-le. – Dai

+0

@Dai Vérifiez le Input.cs, le fichier n'est pas utilisable en C# de ce que je peux voir – pogorman

+0

Qu'est-ce qui vous fait penser que c'est inutilisable? ça à l'air bien pour moi. – Dai

Répondre

1

Il y a deux outils complètement séparés (au moins) dans .net qui parlent "protobuf". On dirait que vous utilisez l'outil à partir d'un (la version de Jon, qui était auparavant "protobuf-csharp-port", mais qui fait maintenant partie de la base de code Google IIRC), mais en utilisant la bibliothèque de l'autre (protobuf -net). Cela ne marchera pas! L'outillage qu'une bibliothèque doit correspondre. Si vous voulez utiliser protobuf-net: utilisez la librairie protobuf-net par elle-même (elle prend en charge "code first", c'est-à-dire sans outil) ou utilisez l'outil protobuf-net avec la librairie protobuf-net.

Si vous voulez utiliser protobuf-csharp-port (qui peut maintenant être simplement "protobuf"): utilisez l'outil à partir de cela, et la bibliothèque à partir de cela.

Pour info, le code-première approche avec protobuf-net, vous pouvez traduire des contrats simples manuellement si vous ne voulez pas avoir à utiliser: construire des marches

[ProtoContract] 
class InputState { 
    [ProtoMember(1)] 
    public uint Input {get;set;} 
    [ProtoMember(2)] 
    public string State {get;set;} 
} 
[ProtoContract] 
class InputStateData { 
    [ProtoMember(1)] 
    public List<InputState> Input {get;} = new List<InputState>(); 
} 
+0

merci! J'espérais que vous donneriez votre avis. L'exemple que vous postez était ce que j'attendais des générateurs à créer. Y a-t-il des générateurs capables de faire cela? De plus, pourquoi l'outil protoc génère-t-il un fichier aussi complexe? – pogorman

+0

@pogorman l'outil 'protogen' dans protobuf-net produit quelque chose comme ça; comme pour "pourquoi": parce que c'est ainsi que le protocole est conçu pour fonctionner –

+0

Je veux communiquer avec un système embarqué (logiciel écrit en C). Les structures qui seront communiquées seront toujours définies du côté de l'intégration. Nous allons utiliser nanopb sur le côté embarqué. Mon espoir était d'utiliser les fichiers proto de l'embarqué et de générer les classes comme vous l'avez posté ci-dessus. Est-ce seulement possible? Ou devrais-je simplement utiliser l'outil standard de protocole? À votre avis, quel est le meilleur générateur de fichiers à utiliser? Merci encore. – pogorman

0

Ok - J'apprends De plus, c'est le générateur de fichiers qui donne le format le plus proche de ce que j'attendais: https://github.com/floatinghotpot/protogen (à utiliser avec protobuf-net). C'est exactement ce dont j'ai besoin.

//------------------------------------------------------------------------------ 
// <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: inputs.proto 
namespace inputs 
{ 
[global::System.Serializable, global::ProtoBuf.ProtoContract([email protected]"InputState")] 
public partial class InputState : global::ProtoBuf.IExtensible 
{ 
public InputState() {} 

private uint _input; 
[global::ProtoBuf.ProtoMember(1, IsRequired = true, [email protected]"input", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)] 
public uint input 
{ 
    get { return _input; } 
    set { _input = value; } 
} 
private string _state; 
[global::ProtoBuf.ProtoMember(2, IsRequired = true, [email protected]"state", DataFormat = global::ProtoBuf.DataFormat.Default)] 
public string state 
{ 
    get { return _state; } 
    set { _state = value; } 
} 
private global::ProtoBuf.IExtension extensionObject; 
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) 
    { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } 
} 

[global::System.Serializable, global::ProtoBuf.ProtoContract([email protected]"InputStateData")] 
public partial class InputStateData : global::ProtoBuf.IExtensible 
{ 
public InputStateData() {} 

private readonly global::System.Collections.Generic.List<InputState> _input = new global::System.Collections.Generic.List<InputState>(); 
[global::ProtoBuf.ProtoMember(1, [email protected]"input", DataFormat = global::ProtoBuf.DataFormat.Default)] 
public global::System.Collections.Generic.List<InputState> input 
{ 
    get { return _input; } 
} 

private global::ProtoBuf.IExtension extensionObject; 
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) 
    { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } 
} 

}