2014-09-15 5 views
3

.proto 파일을 사용하여 protobuf 메시지를 지정합니다. [default=]을 사용하지만 값이 설정된 위치를 볼 수 없습니다. 자동 생성 된 .cs 파일에 없습니다. 메시지를 만들 때 일부 기본값을 설정하고 싶습니다. 자동 생성 된 .cs 파일 안에 있기 때문에 기본 생성자를 사용할 수 없습니다.protobuf-net .proto 파일의 [default]가 인식되지 않습니까?

이 아이디어를 해결하는 방법은 무엇입니까?

내 .proto 파일 :

package Messages; 

message Ack 
{ 
    required bool is_error = 1 [default=false]; 
    required string message = 2 [default="ok"]; 
    required string request_id = 3; 
} 

가 생성

namespace Messages 
{ 
    [global::System.Serializable, global::ProtoBuf.ProtoContract([email protected]"Ack")] 
    public partial class Ack : global::ProtoBuf.IExtensible 
    { 
    public Ack() {} 

    private bool _is_error; 
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, [email protected]"is_error", DataFormat = global::ProtoBuf.DataFormat.Default)] 
    public bool is_error 
    { 
     get { return _is_error; } 
     set { _is_error = value; } 
    } 
    private string _message; 
    [global::ProtoBuf.ProtoMember(2, IsRequired = true, [email protected]"message", DataFormat = global::ProtoBuf.DataFormat.Default)] 
    public string message 
    { 
     get { return _message; } 
     set { _message = value; } 
    } 
    private string _request_id; 
    [global::ProtoBuf.ProtoMember(3, IsRequired = true, [email protected]"request_id", DataFormat = global::ProtoBuf.DataFormat.Default)] 
    public string request_id 
    { 
     get { return _request_id; } 
     set { _request_id = value; } 
    } 
    private global::ProtoBuf.IExtension extensionObject; 
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) 
     { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } 
    } 

내가 사용하는 비주얼 스튜디오 영어 2013 업데이트 3 protobuf - 네트의 최신 버전.

+0

음, 윙윙 거리다. 이것은 당황 스럽다. 귀하의 편집으로 동일한 결과를 얻었습니다. 나는 바퀴가 어딘가에서 떨어 졌음에 틀림 없어! 나는 조사해야 할 것이다. 나는 그것에 대한 즉각적인 대답이 없다. –

+0

이 Marc에 대한 소식이 있습니까? – Michael

답변

1

내가 예를 들어 걸릴 경우

message Foo { 
    optional int32 value = 1 [default = 123]; 
} 

및 protogen을 통해 그 실행은, 그때 얻을 출력은 다음과 같습니다

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

// Generated from: my.proto 
namespace my 
{ 
    [global::System.Serializable, global::ProtoBuf.ProtoContract([email protected]"Foo")] 
    public partial class Foo : global::ProtoBuf.IExtensible 
    { 
    public Foo() {} 

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

} 

이 명확 기본 값을 포함하는 필드 이니셜 라이저에서 모두와 DefaultValueAttribute을 통해 나는 -p:detectMissing 옵션을 추가하면

, 그럼 내가 얻을 :

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

// Option: missing-value detection (*Specified/ShouldSerialize*/Reset*) enabled 

// Generated from: my.proto 
namespace my 
{ 
    [global::System.Serializable, global::ProtoBuf.ProtoContract([email protected]"Foo")] 
    public partial class Foo : global::ProtoBuf.IExtensible 
    { 
    public Foo() {} 

    private int? _value; 
    [global::ProtoBuf.ProtoMember(1, IsRequired = false, [email protected]"value", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)] 
    public int value 
    { 
     get { return _value?? (int)123; } 
     set { _value = value; } 
    } 
    [global::System.Xml.Serialization.XmlIgnore] 
    [global::System.ComponentModel.Browsable(false)] 
    public bool valueSpecified 
    { 
     get { return this._value != null; } 
     set { if (value == (this._value== null)) this._value = value ? this.value : (int?)null; } 
    } 
    private bool ShouldSerializevalue() { return valueSpecified; } 
    private void Resetvalue() { valueSpecified = false; } 

    private global::ProtoBuf.IExtension extensionObject; 
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) 
     { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } 
    } 

} 

이 이제 "게터"의 기본 값을가집니다.

+0

위의 추가 사항을 참조하십시오. – Michael

+0

@Michael 추가 항목이 없습니다. –

+0

죄송합니다. 조금 오래 걸립니다. – Michael