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は私のプロパティに到達し、バッキングフィールドを見つけて設定します.Addか、それともコレクションまたはStockItemsだけになりますか?

4

1 に答える 1

2

リストの場合、読み取り/書き込みである必要はありません。基本的に、読み取り専用の場合は、を使用し.Addます。読み取り/書き込みの場合は、「nullですか?その場合は、リストの新しいインスタンスを作成し、セッターを呼び出します」という追加の処理も行います。これは、怠惰なコードが機能することを意味します。つまり、(ac#の例で)

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

ただし、リストに関する私の個人的な好みは、例のようにリストを読み取り専用にすることです。

protobufが私のプロパティに到達し、バッキングフィールドを見つけて設定するのですか、それとも単にコレクションまたはStockItemsに追加するだけですか?

後者。プロパティからフィールドを解決しようとすることはありません。シリアル化のためにフィールドに明示的にマークを付けると、フィールドで機能しますが、指示がない限り、フィールドは機能しません。

于 2012-07-25T08:20:57.860 に答える