1

私には2つのクラスAとBがあります。クラスBは、以下に示すようにクラスAを継承します。

<ProtoContract()>
Public Class A
    <ProtoMember(1)>
    Public Property ID As Integer
    <ProtoMember(2)>
    Public Property Name() As String = String.Empty
End Class

<ProtoContract()>
Public Class B
    Inherits A
    <ProtoMember(101)>
    Property Title As String = String.Empty
    <ProtoMember(102)>
    Property Status As String = String.Empty
    <ProtoMember(103)>
End Class

ProtoBufを使用してクラスBのインスタンスをシリアル化および逆シリアル化すると、クラスAのプロパティ値が失われます。これについて少し調べた後、どういうわけかクラスBでProtoInclude()タグを使用する必要があると思いますが、運が悪かったです。

サンプルコード:

 Dim stuff as New B
 With stuff
   .ID = 1
   .Name = "Bob"
   .Title = "Director"
   .Status = "Active"
 End With

 Dim buffer as Byte()
 Dim deserializedStuff as new B

 Using memStream As New IO.MemoryStream
     ProtoBuf.Serializer.Serialize(memStream, stuff)
     buffer = memStream.ToArray
 End Using

 Using memStream As New MemoryStream(buffer)
     memStream.Position = 0  
     deserializedStuff = ProtoBuf.Serializer.Deserialize(Of B)(memStream)
 End Using

この時点で、「deserializedStuff」の継承されたプロパティ値は失われます。デフォルト値に設定されているように見えます。私が間違っていることについて何か考えはありますか?前もって感謝します。

4

1 に答える 1

2

AのProtoAttributesで、Bも含めることができることを指定する必要があります。

<ProtoContract(), ProtoInclude(100, GetType(B))>
Public Class A
    <ProtoMember(1)>
    Public Property ID As Integer
    <ProtoMember(2)>
    Public Property Name() As String = String.Empty
End Class

<ProtoContract()>
Public Class B
    Inherits A
    <ProtoMember(1)>
    Property Title As String = String.Empty
    <ProtoMember(2)>
    Property Status As String = String.Empty
End Class

そして、これは私があなたを理解するために使用したテストクラスです。

Public Class Test
    Public Sub New()
        Dim stuff As New B With {.ID = 1, .Name = "Bob", .Title = "Director", 
             .Status = "Active"}

        Dim buffer As Byte()
        Using memStream As New IO.MemoryStream
            ProtoBuf.Serializer.Serialize(memStream, stuff)
            buffer = memStream.ToArray
        End Using

        Dim deserializedStuff As B
        Using memStream As New MemoryStream(buffer)
            memStream.Position = 0
            deserializedStuff = ProtoBuf.Serializer.Deserialize(Of B)(memStream)
        End Using

        Debug.Print(deserializedStuff.ID.ToString & "--" & deserializedStuff.Status)
    End Sub
End Class
于 2012-05-30T22:53:29.000 に答える