[英]protobuf-net [default] in .proto file not recognized?
我使用.proto文件來指定我的protobuf消息。 我使用[default=]
,但我看不到設置值的位置。 它們不在自動生成的.cs文件中。 我想在創建消息時設置一些默認值。 我無法使用默認構造函數,因為它位於自動生成的.cs文件中。
任何想法如何解決這個問題?
我的.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(Name=@"Ack")]
public partial class Ack : global::ProtoBuf.IExtensible
{
public Ack() {}
private bool _is_error;
[global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"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, Name=@"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, Name=@"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); }
}
我使用Visual Studio 2013 Update 3英文版和最新版本的protobuf-net。
如果我以一個例子為例:
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(Name=@"Foo")]
public partial class Foo : global::ProtoBuf.IExtensible
{
public Foo() {}
private int _value = (int)123;
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"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
和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(Name=@"Foo")]
public partial class Foo : global::ProtoBuf.IExtensible
{
public Foo() {}
private int? _value;
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"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); }
}
}
現在,它在“getter”中具有默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.