Protobuf如何设置Readonly属性

时间:2012-07-25 05:27:25

标签: .net protobuf-net

我很清楚这是如何实际工作的,因为我只是想确保我的测试成功并没有错。

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

1 个答案:

答案 0 :(得分:2)

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

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

但是,带有列表的个人偏好是让它们像您的示例一样只读。

  

protobuf是否会进入我的属性并找到支持字段并设置它或者只是。添加到集合或StockItems?

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