我很清楚这是如何实际工作的,因为我只是想确保我的测试成功并没有错。
从我读过的其他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?
答案 0 :(得分:2)
对于列表, 不需要读写;基本上,如果它是只读的,它只使用.Add
。如果它是读写的,那么它还会额外执行“是否为空?如果是,则创建列表的新实例,并调用setter”。这意味着惰性代码可以工作,即(使用c#示例)
[ProtoMember(12)]
public List<Foo> Items {get;set;}
但是,带有列表的个人偏好是让它们像您的示例一样只读。
protobuf是否会进入我的属性并找到支持字段并设置它或者只是。添加到集合或StockItems?
后者。它从不尝试从属性中解析字段。如果明确标记字段用于序列化,它将对它们起作用 - 但如果没有被告知它将不会这样做。