3

我对这实际上是如何工作的很感兴趣,因为我只是想确保我没有弄错我的测试成功的事实。

从我读过的其他 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?

4

1 回答 1

2

对于列表,它不需要是读写;基本上,如果它是只读的,它只使用.Add. 如果它是读写的,那么它还会做一个额外的“它是空的吗?如果是,创建一个列表的新实例,并调用setter”。这意味着惰性代码可以工作,即(以 ac# 为例)

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

但是,我个人对列表的偏好是让它们像您的示例中那样只读。

protobuf 是到达我的财产并找到支持字段并设置它还是只是 .Add 到集合或 StockItems?

后者。它从不尝试从属性中解析字段。如果您明确标记要序列化的字段,它将对它们起作用-但在没有被告知的情况下不会这样做。

于 2012-07-25T08:20:57.860 回答