2010-02-07 8 views
4

J'ai créé un fichier .proto et le fichier .cs créé avec succès par ProtoBufTool. Je suis un peu nouveau à csharp et j'essaye de placer les champs d'extension. Mais je ne sais pas comment le faire? Quelqu'un a-t-il des exemples d'utilisation des extensions avec protobuf-net?Comment utiliser les extensions de protobuf-net?

Mon fichier .proto:

package messages; 
message DMsg 
{ 
    optional int32 msgtype = 1; 
    extensions 100 to max; 
} 
extend DMsg 
{ 
optional string fltColumns = 101; 
} 

Voici la classe qui a obtenu créé:

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


private int _msgtype = default(int); 
[global::ProtoBuf.ProtoMember(1, IsRequired = false, [email protected]"msgtype", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)][global::System.ComponentModel.DefaultValue(default(int))] 
public int msgtype 
{ 
    get { return _msgtype; } 
    set { _msgtype = value; } 
} 
    private global::ProtoBuf.IExtension extensionObject; 
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) 
    { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } 
} 

} 

Répondre

6

protobuf-net n'a pas brillante soutien pour les extensions; vous devez utiliser les numéros de champ (je ne pense pas qu'il fasse quoi que ce soit avec fltColumns pour le moment). Cependant, pour obtenir les valeurs sur vous devriez pouvoir utiliser Extensible.GetValue<T>/TryGetValue<T> (notez vous-même: faites ces méthodes d'extension en C# 3.0). Pour définir une valeur, utilisez AppendValue<T> - il ne peut pas savoir s'il s'agit d'une valeur unique ou d'une liste (repeated). Par conséquent, la même API gère les deux scénarios.

Il est possible que Jon's version (étant beaucoup plus proche de la version Java) a un meilleur support ici.

Exemple (je suis en utilisant des classes écrites à la main par souci de concision, mais il devrait fonctionner avec les types générés aussi):

static void Main() 
    { 
     MyData data = new MyData(); 
     data.Id = 123; 
     // something we know only by field id... 
     Extensible.AppendValue<string>(data, 27, "my name"); 
     string myName = Extensible.GetValue<string>(data, 27); 

     // this should be OK too (i.e. if we loaded it into something that 
     // *did* understand that 27 means Name) 
     MyKnownData known = Serializer.ChangeType<MyData, MyKnownData>(data); 
     Console.WriteLine(known.Id); 
     Console.WriteLine(known.Name); 
    } 

    [ProtoContract] 
    class MyData : Extensible 
    { 
     [ProtoMember(1)] 
     public int Id { get; set; } 
    } 

    [ProtoContract] 
    class MyKnownData 
    { 
     [ProtoMember(1)] 
     public int Id { get; set; } 
     [ProtoMember(27)] 
     public string Name{ get; set; } 
    } 
+0

avez-vous un exemple qui montre comment définir des valeurs et d'obtenir des valeurs? – VNarasimhaM

+0

@VNarasimhaM - ajouté par demande –

Questions connexes