如何在protobuf-net中手动将可选字段添加到类中

时间:2011-06-17 17:29:45

标签: c# protobuf-net

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

您能告诉我如何在C#中的类中实现可选字段吗?我想有一个函数或任何设置字段的idicate(在C ++中我有像hasfoo())。在我在互联网上发现的例子中,没有类似的东西。

1 个答案:

答案 0 :(得分:5)

它支持许多模式,以帮助从其他序列化程序转换。请注意,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 */
}

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