我对这是如何工作的很感兴趣,因为我只是想确保我没有弄错我的测试成功了。
从我读过的其他堆栈溢出问题来看,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操作?
发布于 2012-07-25 16:20:58
对于列表,它不需要是读写的;基本上,如果它是只读的,它只使用.Add。如果它是读写的,那么它还会做一个额外的"is null?如果是,创建一个列表的新实例,并调用setter“。这意味着懒惰代码可以工作,即(使用c#示例)
[ProtoMember(12)]
public List<Foo> Items {get;set;}但是,我个人对列表的偏好是让它们像您的示例中那样是只读的。
是protobuf进入我的属性,找到支持字段并设置它,还是它只是集合的.Add或StockItems?
后者。它从不尝试从属性中解析字段。如果您显式地将字段标记为序列化,它将在这些字段上工作-但如果没有被告知,它不会这样做。
https://stackoverflow.com/questions/11643278
复制相似问题