如何将默认值指定为非序列化

时间:2011-11-17 04:11:30

标签: protobuf-net

假设以下类,是否有任何方法可以提供“如果成员具有特定值,请不要将其序列化”

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比一点点性能更重要。

1 个答案:

答案 0 :(得分:3)

两个选项:

  1. 您可以添加[DefaultValue(...)](或VB中的等效语法),注意日期时间需要作为字符串存储(在属性中),并且库使用CultureInfo.InvariantCulture作为格式化程序,所以[DefaultValue("12/15/1980")]应该做的工作
  2. 您可以使用一些条件序列化模式;最简单的是ShouldSerialize*模式,为方便起见,在C#中显示:

    private static readonly defaultDate = new DateTime(1980, 12, 15);
    public bool ShouldSerializeTransferDate() {
        return DateTransferTest != defaultDate;
    }
    
  3. (对于XmlSerializer ShouldSerialize*方法需要public;如果您愿意,protobuf-net将使用private方法

    请注意,在任何一种情况下,都应确保日期默认正确,例如通过field-initializer,constructor或before-deserialization回调将值设置为默认值。