2012-12-14 105 views
2

我們嘗試使用protobuf-net,但無法理解我們現在在自定義RuntimeTypeModel中禁用的UseImplicitZeroDefaults。我們最初使用默認的RuntimeTypeModel,但注意到即使指定了DefaultValue也不會克隆布爾屬性,即DefaultValue = true,但設置爲false時,克隆屬性將始終爲true。protobuf-net UseImplicitZeroDefaults和枚舉默認值

我們通過創建一個自定義的RuntimeTypeModel來解決這個問題,它允許我們將UseImplicitZeroDefaults設置爲false。但將其設置爲false會導致以下錯誤;

ProtoBuf.ProtoException: No wire-value is mapped to the enum 

請注意,我們的一些枚舉是非零基礎的,這可能會導致一個問題?我們如何克隆/序列化布爾屬性和枚舉(基於非零和零的混合)?

編輯:我使用了一些信息,在發現:protobuf-net enum serialization並且可以報告:

[ProtoMember(10), DefaultValue(SiteType.Partition)] 
public SiteType Type { get; set; } 

仍然導致了「無絲價值」的錯誤。

[ProtoMember(10, IsRequired = true)] 
public SiteType Type { get; set; } 

仍導致「無線值」錯誤。

public enum SiteType 
{ 
    Error = 0, 
    ... 

這個工程,但理想情況下,我們想離開我們的枚舉乾淨。
也許一個更清潔的方式來指定默認值:

[DefaultValue(SiteType.Server)] 
public enum SiteType 
{ 
    Server = 1, 
    Monkey = 2 
    ... 
+0

我得看看 - 今晚太晚了;但是:如果你設置了IsRequired = true,它會起作用嗎? –

+0

IsRequired設置在屬性級別,但是爲了避免過度裝飾我們使用的[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]類。所以我們不在物業層面設置任何東西,也許我們應該! – paligap

+0

我會調查,看看這裏是否有問題 –

回答

3

我們通過指定一個默認的枚舉基於任何非零枚舉解決了這個問題。我們在被序列化的類的構造函數中指定了默認值。這是迄今爲止最完整的解決方案,並且不需要任何額外的protobuf-net屬性。

此外,明確設置非零基礎枚舉屬性的默認值是有意義的。

+0

感謝您的更新;我仍然會進行調查,但是:聖誕節等事情會變得很忙碌 –