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); }
}

是否可以提供其他的原代选项来纠正这个问题?

protobuf-net和可选值

事实证明,这是由名为value的.proto属性之间的C#保留关键字冲突引起的,该属性会生成无法编译的代码。将自动生成属性的名称更改为returnValue可以解决问题。。。直到下一次代码自动生成。