Question

J'ai créé un fichier .proto et le fichier ProtoBufTool .cs créé avec succès. Je suis un peu nouveau pour csharp et je suis en train de définir les champs d'extension. Mais ne savez pas comment faire? Quelqu'un at-il des exemples comment utiliser les extensions en utilisant 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 été effectivement 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(Name=@"DMsg")]
public partial class DMsg : global::ProtoBuf.IExtensible
{
  public DMsg() {}


private int _msgtype = default(int);
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"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); }
}

}
Était-ce utile?

La solution

protobuf-net n'a pas brillant le support des extensions; vous devez utiliser les numéros de terrain (je ne pense pas que ce soit quelque chose avec fltColumns pour le moment). Cependant, pour obtenir des valeurs sur vous devriez être en mesure d'utiliser Extensible.GetValue<T> / TryGetValue<T> (note à l'auto: rendre ces méthodes d'extension en C # 3.0). Pour définir une utilisation de valeur AppendValue<T> -. Il ne peut pas savoir si cela est une seule valeur ou une liste (repeated), de sorte que la même API gère les deux scénarios

Il est possible que version Jon (é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 brièveté, 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; }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top