BinaryFormatter.Serialize の使用に問題があります。
バイナリシリアル化を介してオブジェクトを「複製」するためのこの汎用拡張メソッドがあります。
<Extension()>
Public Function CloneViaSerialization(ByRef Obj as System.Object)
Dim NewObj As System.Object
Using MS As New System.IO.MemoryStream
Dim Formatter as New BinaryFormatter
Formatter.Serialize(MS, Obj)
Debug.WriteLine("MS LENGTH = " & MS.Length)
MS.Position = 0
NewObj = Formatter.Deserialize(MS)
End Using
Return NewObj
End Function
次のように「Clone」メソッドを持つ「Mode」というクラスもあります。
Friend Function Clone()
Dim NewMode as Mode = Me.CloneViaSerialization
Return NewMode
End Function
私の GUI には、選択した Mode オブジェクトのクローンを作成できる機能があります。ユーザーが一連の新しいモード名を入力すると、ルーチンがこれらの新しい名前を循環して、選択したモードのクローンを作成します。
Private Sub MakeClones(ByRef ModeToClone as Mode, ByVal CloneNames as List(Of String))
For Each CloneName as String in CloneNames
Dim NewMode as Mode = ModeToClone.Clone
NewMode.Name = CloneName
ParentObject.Modes.Add(NewMode)
Next
End Sub
したがって、基本的には、選択した Mode オブジェクトの 1 つまたは複数のクローンを作成し、Name プロパティを正しい値に設定し、新しい Mode オブジェクトを親に追加する必要があります。これには、Mode.Clone メソッドへの X 回の呼び出しと、CloneViaSerialization 拡張メソッドへの X 回の呼び出しが含まれます。
これが私の問題です。CloneViaSerialization を複数回呼び出している間、MemoryString の長さ (Debug.WriteLine ステートメントで表示される) は、前回の呼び出しのほぼ 2 倍になります。たとえば、5 つのクローンを作成すると、デバッグ出力は次のようになります。
MS の長さ = 106882 MS の長さ = 188048 MS の長さ = 350482 MS の長さ = 675350 MS の長さ = 1325086
これは致命的なパフォーマンスです。約 7 または 8 個のクローンを超えると、アプリが停止します。なぜこれが起こるのでしょうか?USING ブロックは、MemoryString が確実に破棄されるようにする必要がありますね。毎回新しい MemoryString を作成するべきではありませんか? 同じ元の Mode オブジェクトがシリアル化のソースであるため、MemoryString の長さは同じになると思います。何か案は?ここで何が欠けていますか?
前もって感謝します!