【问题标题】:How to use protobuf-net extensions?如何使用 protobuf-net 扩展?
【发布时间】:2010-02-07 23:20:49
【问题描述】:

我已经创建了一个 .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); }
}

}

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    protobuf-net 没有brilliant 对扩展的支持;您需要使用字段编号(我认为它目前对fltColumns 没有任何作用)。但是,要获取值 out,您应该能够使用 Extensible.GetValue<T> / TryGetValue<T>(自我注意:在 C# 3.0 中制作这些扩展方法)。要设置一个值,请使用 AppendValue<T> - 它无法知道这是一个单值还是一个列表 (repeated),因此同一个 API 可以处理这两种情况。

    Jon's version(更接近 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; }
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多