【发布时间】:2011-06-17 17:29:45
【问题描述】:
在我的 .proto 中,我有一些带有可选字段的消息。 Debian 没有原生 protogen,所以我没有一个可以试验(懒得自己编译了:)。
您能告诉我如何在 C# 的类中实现可选字段吗?我想要一个函数或任何表明该字段已设置的东西(在 C++ 中我有类似 hasfoo() 的东西)。在我在互联网上找到的示例中,没有这样的东西。
【问题讨论】:
标签: c# protobuf-net
在我的 .proto 中,我有一些带有可选字段的消息。 Debian 没有原生 protogen,所以我没有一个可以试验(懒得自己编译了:)。
您能告诉我如何在 C# 的类中实现可选字段吗?我想要一个函数或任何表明该字段已设置的东西(在 C++ 中我有类似 hasfoo() 的东西)。在我在互联网上找到的示例中,没有这样的东西。
【问题讨论】:
标签: c# protobuf-net
它在这里支持多种模式,以帮助从其他序列化程序转换。请注意,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 */
}
因为您可以将其添加到单独的代码文件中。
【讨论】: