2011-11-17 25 views
2

假設下面的類,有沒有辦法提供一個「如果會員有一個特定的值,不連載它」如何指定一個默認值不序列

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比一點表現更重要。

回答

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; 
    } 
    

(爲XmlSerializerShouldSerialize*方法必須public;如果你喜歡protobuf網將使用private方法,雖然)

請注意,無論哪種情況,都應該確保日期默認正確,例如通過字段初始值設定項,構造函數或反序列化前回調將值設置爲默認值。

+0

功能應該是ShouldSerializeTransferDate(propertyname) 非常非常酷,謝謝 –

+0

@PaulFarry複製/粘貼錯誤;固定。該機制無恥地從支持相同方法的「TypeDescriptor」和「XmlSerializer」中借用 –