【问题标题】:Properties and fields should be marked as ProtoMember?属性和字段应该标记为 ProtoMember?
【发布时间】:2015-03-03 16:42:28
【问题描述】:

您好,我是 Protobuf 的新手。

我想将某个信息序列化为 byte[] 发送它并抛出一个通道,并且我想“在另一边”访问该原始信息。

简单代码示例:

[ProtoContract]
public class HttpTunnelResponse
{
  [ProtoMember(1)]
  private HttpStatusCode statusCode;

  public HttpTunnelResponse(HttpStatusCode statusCode)
  {
     this.statusCode = statusCode;
  }

  [ProtoMember(2)]
  public HttpStatusCode StatusCode
  {
     get
     {
        return statusCode;
     }
  }
}

我必须将哪些对象定义为 ProtoMember? 只有私有/公共领域? 我是否还需要将所有属性都设为 ProtoMember?

我在这方面有点菜鸟,所以如果你知道一些很好的教程来解释 Protobuf 序列化/反序列化,我会很高兴。

【问题讨论】:

    标签: c# serialization protobuf-net


    【解决方案1】:

    只要字段是自动生成的,带有公共 getter 的公共属性就可以是 ProtoMembers。以下将起作用。

    [ProtoMember(1)]
    public HttpStatusCode StatusCode { get; }
    

    如果 getter 指向其他地方,例如您的情况,您必须将私有字段设置为 proto 成员。以下将起作用。

    [ProtoMember(1)]
    private HttpStatusCode statusCode;
    
    public HttpStatusCode StatusCode => statusCode;
    

    并非所有字段/属性都必须是 proto 成员。如果有一个属性只取另一个值并显示不同的结果,则可以使用特殊属性将其忽略。像这样。

    [ProtoIgnore]
    public string Text => $"Status: {StatusCode}";
    

    关于教程,请尝试在互联网上搜索。像this one(从搜索结果中随机选择)这样的一般问题可能无法提供所有答案,但您不应该害怕四处玩耍,看看哪些有效,哪些无效。然后寻找细节。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多