Listのコピーについて(ディープコピーに失敗) への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 やむちゃ  (社会人) 投稿日時 2017/9/17 21:57:06
魔界の仮面弁士様

返信が遅れてしまい申し訳ありません。
(返信したつもりでした)

問題の件ですが、
Personクラスに、単にDeserializeというメソッドが抜けていました。

解決済ですので、ステータスを変更します。

お騒がせして申し訳ありませんでした。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/6/17 17:06:21
Person クラスの定義も、.NET Framework のバージョンも分からないので
判断しにくいのですが、ひとまず、下記の Person クラスで動作しますか?

<Serializable()> Public Class Person
    Public Property Type As String
End Class
投稿者 やむちゃ  (社会人) 投稿日時 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