假设以下类,是否有任何方法可以提供“如果成员具有特定值,请不要将其序列化”
Imports ProtoBuf
<ProtoContract()>
Public Class DateTransferTest
<ProtoMember(1)>
Public Property TransferDate As DateTime
End Class
例如在protobuf中,如果整数的值为0,则不会序列化。
例如
<ProtoMember(1), ProtoNoSerialiseValue(New DateTime(1980, 12, 15))
我知道这可能会增加开销但是想知道是否有某种方式可以做到这一点。在我的项目中,Wiresize比一点点性能更重要。
答案 0 :(得分:3)
两个选项:
[DefaultValue(...)]
(或VB中的等效语法),注意日期时间需要作为字符串存储(在属性中),并且库使用CultureInfo.InvariantCulture
作为格式化程序,所以[DefaultValue("12/15/1980")]
应该做的工作您可以使用一些条件序列化模式;最简单的是ShouldSerialize*
模式,为方便起见,在C#中显示:
private static readonly defaultDate = new DateTime(1980, 12, 15);
public bool ShouldSerializeTransferDate() {
return DateTransferTest != defaultDate;
}
(对于XmlSerializer
ShouldSerialize*
方法需要public
;如果您愿意,protobuf-net将使用private
方法
请注意,在任何一种情况下,都应确保日期默认正确,例如通过field-initializer,constructor或before-deserialization回调将值设置为默认值。