سؤال

لقد قمت بإنشاء ملف .proto وإنشاء Protobuftool بنجاح ملف .cs. أنا كيندا جديد في csharp وأنا أحاول ضبط حقول التمديد. ولكن غير متأكد من كيفية القيام بذلك؟ هل لدى أي شخص أي أمثلة كيفية استخدام ملحقات باستخدام Protobuf-Net.

ملف بلدي .proto:

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

فيما يلي الفصل الذي تم إنشاؤه:

//------------------------------------------------------------------------------
// 
//     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); }
}

}
هل كانت مفيدة؟

المحلول

Protobuf-Net لا تملك متألق دعم الامتدادات؛ تحتاج إلى استخدام أرقام الحقول (لا أعتقد أنه يفعل أي شيء fltColumns في اللحظة). ومع ذلك، للحصول على القيم خارج يجب أن تكون قادرا على استخدام Extensible.GetValue<T> / TryGetValue<T> (لاحظ إلى الذات: اجعل طرق الإرشاد تلك في C # 3.0). لتعيين استخدام القيمة AppendValue<T> - لا يمكن أن يعرف ما إذا كانت هذه قيمة واحدة أو قائمة (repeated)، وبالتالي فإن نفس API يعالج كلا السيناريوهات.

من الممكن ذلك إصدار جون (كونك أقرب بكثير من إصدار Java) لديه دعم أفضل هنا.

مثال (أنا أستخدم فئات مكتوبة يدويا للإيجاز، ولكن يجب أن تعمل مع الأنواع الناتجة أيضا):

    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; }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top