投稿者 やむちゃ  (社会人) 投稿日時 2017/6/16 15:15:31
Personクラスを継承したCustomPersonという独自のクラスを、Listコレクションにまとめ、それをコピーしたいのですが上手くいきません。

(※Personクラスというのは、あくまでも例です。ちなみに継承せずに、PersonクラスをまとめたListコレクションのディープコピーは上手くいきました。)

下記コードのDeepCopyHelper.DeepCopyにて
シリアライズ後、デシリアライズの際に
(下記のコードでいうと、「result = CType(b.Deserialize(mem), T)」のところです)
「CustomPerson型のオブジェクトを逆シリアル化するコンストラクタが見つかりませんでした。」
というエラーが発生します。

エラー対応としてCustomClassに

Public Sub New()
        BloodType = "A"
End Sub

上記のようなコード(コンストラクタ)を追加しましたが、結果は同じでした。

エラーの解決方法、他の方法でコピーが可能であれば、ご教示宜しくお願いします。

###############↓以下、実装してみたコードです  ############################
Imports System.Runtime.Serialization.Formatters.Binary

Public Class Form1
    
    Private PersonList As List(Of CustomPerson)
    Private CopyList As List(Of CustomPerson)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

PersonList = New  List(Of CustomPerson)
CopyList = New  List(Of CustomPerson)

Dim person1 As New CustomPerson
        person1.Type = "A"
PersonList.Add(person1) 

        Dim person2 As New CustomPerson
        person2.Type = "B"
PersonList.Add(person2)

CopyList = DeepCopyHelper.DeepCopy(PersonList)

End Sub

<Serializable>
Public Class CustomPerson
Inherits Person

Property BloodType As String

End Class



Public Class DeepCopyHelper

    Public Shared Function DeepCopy(Of T)(ByVal target As T) As T

        Dim result As T
        Dim b As New BinaryFormatter

        Dim mem As New System.IO.MemoryStream()

        Try

            b.Serialize(mem, target)
            mem.Position = 0
            result = CType(b.Deserialize(mem), T)

        Finally

            mem.Close()

        End Try

        Return result

    End Function

End Class