首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Protobuf如何设置Readonly属性

问Protobuf如何设置Readonly属性
EN

Stack Overflow用户
提问于 2012-07-25 13:27:25
回答 1查看 1K关注 0票数 3

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

从我读过的其他堆栈溢出问题来看,protobuf不能设置只读属性。但它似乎做得很好。

我有下面的类(为了演示而修剪)

代码语言:javascript
复制
<
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

当我用下面的代码测试它时,它是成功的。

代码语言:javascript
复制
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操作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-25 16:20:58

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

代码语言:javascript
复制
[ProtoMember(12)]
public List<Foo> Items {get;set;}

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

是protobuf进入我的属性,找到支持字段并设置它,还是它只是集合的.Add或StockItems?

后者。它从不尝试从属性中解析字段。如果您显式地将字段标记为序列化,它将在这些字段上工作-但如果没有被告知,它不会这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11643278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档