Listのコピーについて(ディープコピーに失敗) への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2017/6/17 17:06:21
Person クラスの定義も、.NET Framework のバージョンも分からないので
判断しにくいのですが、ひとまず、下記の Person クラスで動作しますか?
判断しにくいのですが、ひとまず、下記の 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
(※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
返信が遅れてしまい申し訳ありません。
(返信したつもりでした)
問題の件ですが、
Personクラスに、単にDeserializeというメソッドが抜けていました。
解決済ですので、ステータスを変更します。
お騒がせして申し訳ありませんでした。