protobuf-net和可选值
本文关键字:protobuf-net | 更新日期: 2023-09-27 18:20:25
我正试图从.proto文件生成协议缓冲区C#代码,不幸的是,protobuf-net生成的代码无法编译。
导致问题的.proto的特定部分是:
// Counter value response
message RpbCounterGetResp {
optional sint64 value = 1;
}
当protobuf net使用命令行工具'C:'Program Files (x86)'protobuf-net'protobuf-net-VS9'protogen.exe' -p:detectMissing -ns:CorrugatedIron.Messages -i:riak_kv.proto -o:riak_kv.cs
自动生成时
我得到了以下不可编译的代码块:
[global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"RpbCounterUpdateResp")]
public partial class RpbCounterUpdateResp : global::ProtoBuf.IExtensible, global::System.ComponentModel.INotifyPropertyChanging
{
public RpbCounterUpdateResp() {}
private long? _value;
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"value", DataFormat = global::ProtoBuf.DataFormat.ZigZag)]
public long value
{
get { return _value?? default(long); }
set { OnPropertyChanging(@"value"); _value = value; }
}
[global::System.Xml.Serialization.XmlIgnore]
[global::System.ComponentModel.Browsable(false)]
public bool valueSpecified
{
get { return _value != null; }
/* this is the big that won't compile as there's no conversion
between bool and System.Nullable<long>
*/
set { if (value == (_value== null)) _value = value ? value : (long?)null; }
}
private bool ShouldSerializevalue() { return valueSpecified; }
private void Resetvalue() { valueSpecified = false; }
public event global::System.ComponentModel.PropertyChangingEventHandler PropertyChanging;
protected virtual void OnPropertyChanging(string propertyName)
{ if(PropertyChanging != null) PropertyChanging(this, new global::System.ComponentModel.PropertyChangingEventArgs(propertyName)); }
private global::ProtoBuf.IExtension extensionObject;
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
{ return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
}
是否可以提供其他的原代选项来纠正这个问题?
事实证明,这是由名为value
的.proto属性之间的C#保留关键字冲突引起的,该属性会生成无法编译的代码。将自动生成属性的名称更改为returnValue
可以解决问题。。。直到下一次代码自动生成。