C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

StructureをDeepCopyする方法

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■93478 / inTopicNo.1)  StructureをDeepCopyする方法
  
□投稿者/ かかか (1回)-(2019/12/13(Fri) 22:21:39)

分類:[.NET 全般] 

    <Serializable()>
    Public Class aaa1_Class

        Property bbb1 As New bbb1_Class

    End Class



    <Serializable()>
    Public Class bbb1_Class

        Property p1 As Single
        Property p2 As Single

    End Class



    <Extension()>
    Public Function DeepCopy(ByVal target As Object) As Object

        Dim result As Object
        Dim b As New BinaryFormatter

        Dim mem As New System.IO.MemoryStream()

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

        Return result

    End Function



Sub

Dim test As New aaa1_Class
Dim test2 = test.DeepCopy

End Sub

はエラーが出ないのですが、





    <Serializable()>
    Public Class aaa2_Class

        Property bbb2 As bbb2_Structure

    End Class


    Public Structure bbb2_Structure

        Property p1 As Single
        Property p2 As Single

    End Class


Sub

Dim test As New aaa2_Class
Dim test2 = test.DeepCopy

End Sub


だとエラーが出ます。


クラスの中にクラスが入っている場合には
DeepCopyできますが、
Structureの場合にはできないようです。

StructureもまとめてDeepCopyするにはどのようにしたら良いですか?

引用返信 編集キー/
■93479 / inTopicNo.2)  Re[1]: StructureをDeepCopyする方法
□投稿者/ Hongliang (937回)-(2019/12/14(Sat) 09:20:27)
> エラーが出ます。
だけでなく、その内容を記述してください。以下のようなやつです。

System.Runtime.Serialization.SerializationException: アセンブリ 'Hoge, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' の型 'Fuga' はシリアル化可能として設定されていません。

その続きにあるメンバ呼び出し履歴(スタックトレース)もあればなお良いです(フォルダ名が出るのでうっかり個人名が含まれていたりしないかの確認は必要ですが)。

さて、ぱっと見た感じStructureの方にはbbb2_Structureの方に<Serializable()>が付いていないようですが?
引用返信 編集キー/
■93480 / inTopicNo.3)  Re[1]: StructureをDeepCopyする方法
□投稿者/ KOZ (73回)-(2019/12/14(Sat) 10:13:11)
No93478 (かかか さん) に返信

Structure も Serializable をつけていただくとして、ジェネリック使うといろいろ捗ります。

<Extension()>
Public Function DeepCopy(Of T)(ByVal target As T) As T
    Dim b As New BinaryFormatter
    Using mem As New System.IO.MemoryStream()
        b.Serialize(mem, target)
        mem.Position = 0
        Return DirectCast(b.Deserialize(mem), T)
    End Using
End Function


引用返信 編集キー/
■93481 / inTopicNo.4)  Re[2]: StructureをDeepCopyする方法
□投稿者/ かかか (2回)-(2019/12/14(Sat) 11:25:56)
ありがとうございます。

bbb2_Structureに<Serializable()>を付けていないのが原因でした。
以前、試した時には、Structureに<Serializable()>を付けるとエラーが出たので
Classにしか付けられないのだと勘違いしていました。
いま試してみると、なぜか普通にうまくいきました。

あと、ジェネリックをつけると捗る、というのはどういう時に
違いが見られますでしょうか?

引用返信 編集キー/
■93482 / inTopicNo.5)  Re[3]: StructureをDeepCopyする方法
□投稿者/ 魔界の仮面弁士 (2528回)-(2019/12/14(Sat) 11:44:45)
No93481 (かかか さん) に返信
> あと、ジェネリックをつけると捗る、というのはどういう時に
> 違いが見られますでしょうか?

下記のコードにおける変数 b のデータ型が、
かかかさんの実装だと As Object になり、
KOZ さんの実装だと As aaa2_Class になります。


Dim a As New aaa2_Class With {.bbb2 = New bbb2_Structure With {.p1 = Single.NegativeInfinity, .p2 = Single.NaN}}
Dim b = a.DeepCopy()
引用返信 編集キー/
■93487 / inTopicNo.6)  Re[4]: StructureをDeepCopyする方法
□投稿者/ かかか (3回)-(2019/12/14(Sat) 22:12:05)
ありがとうございます。

これは素晴らしいです!!!!!!

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ