Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

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

タグの編集...

投稿者 やむちゃ   (社会人)   投稿日時 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

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

<Serializable()> Public Class Person
    Public Property Type As String
End Class