【问题标题】:how to add optional field to a class manually in protobuf-net如何在 protobuf-net 中手动向类添加可选字段
【发布时间】:2011-06-17 17:29:45
【问题描述】:

在我的 .proto 中,我有一些带有可选字段的消息。 Debian 没有原生 protogen,所以我没有一个可以试验(懒得自己编译了:)。

您能告诉我如何在 C# 的类中实现可选字段吗?我想要一个函数或任何表明该字段已设置的东西(在 C++ 中我有类似 hasfoo() 的东西)。在我在互联网上找到的示例中,没有这样的东西。

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    它在这里支持多种模式,以帮助从其他序列化程序转换。请注意,protobuf-net protogen 中有选项可以自动为您包含此类成员。

    首先,省略任何null;这包括 null 引用和 Nullable<T> 结构。所以:

    [ProtoMember(1)]
    public int? A {get;set;}
    

    会表现出来。

    另一个选项是默认值;使用 .NET 约定:

    [ProtoMember(2), DefaultValue(17)]
    public int B {get;set;}
    

    17 的值不会被序列化。

    为了更明确的控制,观察ShouldSerialize* 模式(来自XmlSerializer)和*Specified 模式(来自DataContractSerializer),所以你可以这样做:

    [ProtoMember(3)]
    public string C {get;set;}
    
    public bool ShouldSerializeC() { /* return true to serialize */ }
    

    [ProtoMember(4)]
    public string D {get;set;}
    
    public bool DSpecified {get;set;} /* return true to serialize */
    

    这些可以是公共的或私有的(除非您正在生成一个需要公共的独立序列化程序集)。

    如果您的主要类来自代码生成,那么partial class 是一个理想的扩展点,即

    partial class SomeType {
        /* extra stuff here */
    }
    

    因为您可以将其添加到单独的代码文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多