2012-07-25 129 views
2

我很關心這是如何實際工作的,因爲我只是想確保我沒有誤認爲我的測試成功。Protobuf如何設置只讀屬性

從我讀過的其他stackoverflow問題,protobuf無法設置只讀屬性。但似乎這樣做很好。

我有下面的類(修剪證明)

< 
ProtoContract() 
> _ 
Public Class WebOrder 
    Implements IWebOrder 

    Friend Sub New() 
     MyBase.New() 
     mItems = New Ordered.StockItemsCollection 
    end sub 

    Private mItems As Ordered.StockItemsCollection 
    <ProtoMember(4)> 
    Public ReadOnly Property Items As Ordered.StockItemsCollection 
     Get 
      Return mItems 
     End Get 
    End Property 

    Private ReadOnly Property COMItems As Ordered.StockItemsCollection Implements IWebOrder.Items 
     Get 
      Return mItems 
     End Get 
    End Property 
end class 

當我測試這個用下面的代碼是成功的。

Dim si As New WebConnector.Ordered.StockItem With {.ItemType = WebConnector.StockItemType.Instruction, 
        .Description = "test", .Quantity = 5} 

activeOrder.Items.Add(si) 

Using ms As New MemoryStream 
    ProtoBuf.Serializer.Serialize(Of WebConnector.WebOrder)(ms, activeOrder) 
    ms.Seek(0, SeekOrigin.Begin) 
    ch = ProtoBuf.Serializer.Deserialize(Of WebConnector.WebOrder)(ms) 
End Using 

For Each si In ch.Items 
    Debug.Print(si.ItemType.ToString & " --- " & si.Description & " --- x" & si.Quantity) 
Next 

結果:

指令---測試--- X5

是protobuf的把手伸進我的財產,並找到支持字段,並將其設置或只是.Add到集合或StockItems ?

回答

2

對於列表,它不需要需要是可讀寫的;基本上,如果它是隻讀的,它只是使用.Add。如果它是可讀寫的,那麼它也會做一個額外的「它是空的?如果是,創建一個新的列表實例,並調用setter」。這意味着懶惰的代碼工作,即(用C#示例)

[ProtoMember(12)] 
public List<Foo> Items {get;set;} 

但是,我個人喜好與名單是讓他們只讀就像在你的榜樣。

protobuf伸手到我的財產和尋找支持領域和設置它或只是它。添加到集合或StockItems?

後者。它永遠不會嘗試從屬性中解析字段。如果你明確標記字段的序列化,它將在他們的工作 - 但它不會這樣做,沒有被告知。

+0

再次感謝您的澄清 – 2012-07-25 11:41:40