2010-02-07 7 views
4

.proto 파일을 만들고 ProtoBufTool이 .cs 파일을 만들었습니다. 나는 좀 새로운 csharp이고 확장 필드를 설정하려고합니다. 그러나 그것을하는 방법을 모르십니까? protobuf-net을 사용하여 확장 기능을 사용하는 방법에 대한 사례가있는 사람이 있습니까? 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([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); } 
} 

} 

답변

6

protobuf - 그물 확장을위한 화려한 지원하지 않습니다; 필드 번호를 사용해야합니다 (나는 지금 fltColumns으로 아무것도하지 않는다고 생각합니다). 그러나 으로 가져 오려면 Extensible.GetValue<T>/TryGetValue<T> (참고 사항 : C# 3.0에서 해당 확장 메서드를 사용하십시오.)을 사용할 수 있어야합니다. 값을 설정하려면 AppendValue<T>을 사용하십시오.이 값이 단일 값인지 또는 목록 (repeated)인지 알 수 없으므로 동일한 API가 두 시나리오를 처리합니다.

Jon's version (자바 버전에 훨씬 가깝습니다)이 더 나은 지원을 할 수 있습니다.

예 (I는 간결 손으로 쓴 클래스를 사용하고,하지만 너무 발생 유형과 작동합니다) :

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

당신은 값을 설정하고 값을 가져 오는 방법을 보여줍니다 예를해야합니까? – VNarasimhaM

+0

@VNarasimhaM - 요청 당 추가 –

관련 문제