Protobuf如何设置只读属性

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 是否进入我的属性并找到支持字段并设置它,还是只是在集合或 StockItems 中添加 .Add

1个回答

2

对于列表,它不需要是可读写的;基本上,如果它是只读的,它只使用.Add。如果它是可读写的,则还会执行额外的“它是否为空?如果是,则创建列表的新实例,并调用setter”的操作。这意味着懒惰的代码可以工作,例如(使用c#示例):

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

然而,对于列表,我的个人偏好是像你的示例一样将它们设置为只读。

Protobuf是通过访问我的属性并找到支持字段并将其设置,还是仅仅添加到集合或StockItems中?

后者。它从不尝试从属性解析字段。如果您显式标记字段进行序列化,它将对它们进行操作 - 但未经告知,它不会这样做。


再次感谢您的澄清。 - Paul Farry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接