BinaryFormatter.Serialize를 사용하는 데 문제가 있습니다. MemoryStream 문제가있는 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
나는 또한 클래스는 방법 "복제"다음과 같이있다 "모드"라고했다 :
Friend Function Clone()
Dim NewMode as Mode = Me.CloneViaSerialization
Return NewMode
End Function
을
GUI 내에서 선택한 모드 개체를 복제 할 수있는 기능이 있습니다. 사용자가 선택한 모드의 클론 생성하는 새 이름을 통해 새 모드 이름과 일상 사이클의 일련의 입력 : 그래서 기본적으로 선택된 모드 객체의 하나 또는 그 이상의 클론한다고
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
가 생성 될를 Name 속성 올바른 값으로 설정하고 새 Mode 객체를 부모에 추가합니다. 여기에는 Mode.Clone 메서드에 대한 X 번 호출과 CloneViaSerialization 확장 메서드에 대한 X 번 호출이 포함됩니다.
여기에 문제가 있습니다. CloneViaSerialization을 여러 번 호출하는 동안 MemoryString 길이 (Debug.WriteLine 문에 표시됨)는 이전 호출과 거의 같습니다. 예를 들어, 다섯 개의 클론을 디버그 출력된다 :
가MS 길이 = 106,882 MS 길이 = 188,048 MS 길이 = 350,482 MS 길이 = 675,350 MS 길이 이것은 1,325,086
이다 = 살해 성과. 약 7 ~ 8 개의 클론이 앱을 중단시킵니다. 왜 이런 일이 일어 났을까요? USING 블록은 MemoryString이 삭제되었는지 확인해야합니다. 맞습니까? 매번 새로운 MemoryString을 만들어야하지 않습니까? 동일한 원본 Mode 객체가 직렬화의 소스이기 때문에 MemoryString 길이가 같을 것이라고 생각합니다. 어떤 아이디어? 내가 여기서 무엇을 놓치고 있니?
미리 감사드립니다.
Mode 클래스의 다른 속성은 무엇입니까? 모드가 다른 모드를 참조 할 수있게 해주는 속성이 있습니까? – rsbarro
다른 속성은 모두 String, Int16 또는 Int16의 List입니다. 그럼에도 불구하고 여러 번 복제 된 동일한 Mode 객체이므로 MemoryString의 크기는 항상 같아야한다고 생각합니까? – Steve
네, 그건 이상합니다. 'base.MemberwiseClone()'을 사용하는 대신에 직렬화를 사용하여 복제하는 이유가 있습니까? – rsbarro