У меня проблема с использованием 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
У меня также есть класс с именем «Mode», который имеет метод «Clone» следующим образом:
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, свойство Name установить на правильное значение и новые объекты Mode добавить в родительский объект. Это включает в себя количество вызовов X в метод Mode.Clone и, в свою очередь, вызов X в метод расширения CloneViaSerialization.
Вот моя проблема. Во время нескольких вызовов CloneViaSerialization длина MemoryString (как показано в операторе Debug.WriteLine) почти вдвое превышает предыдущий вызов. Например, делая пять клонов, выходные данные отладки:
MS LENGTH = 106882
MS LENGTH = 188048
MS LENGTH = 350482
MS LENGTH = 675350
MS LENGTH = 1325086
Это убийственное представление. Все, что больше, чем 7 или 8 клонов, останавливает приложение. Почему это случилось? Блок USING должен гарантировать удаление MemoryString, верно? Не следует ли каждый раз создавать новую MemoryString? Я думаю, поскольку исходный объект Mode является источником для сериализации, поэтому длина MemoryString будет такой же. Есть идеи? Что мне здесь не хватает?
Заранее спасибо!