2011-12-06 2 views
0

이것이 가능합니까? 당신과 같이 직렬화 된 파일에서 foo를로드 할 수 있도록오브젝트 내부 오브젝트 비 직렬화

Public Class Foo 
    public var as string 

    public sub Load(byval filename as string) 
     'This is done 
     [...] 
     oItem = [...] 'Code to deserialize 

     me = oItem 'THIS LINE 
    end sub 
end class 

:

내가 객체로 푸를 반환하는 함수를 했어 지금까지 (내가 만들려고 노력하고있어 최대
Public Sub Main 
    Dim f as Foo = new Foo() 
    f.load("myFile") 
end sub 

serialize/deserialize 프로세스 일반이므로 복사하여 붙여 넣기 만하면 각 변수를 명시 적으로 설정하지 않아도됩니다.)

답변

1

아니요, 귀하의 경우에는 새로 작성한 항목을 반환하는 공유 함수가 있어야합니다.

과 같습니다 :

''' <summary> 
''' This method is used to deserialize an object from a file that was serialized using the SoapFormatter 
''' </summary> 
''' <param name="sFileName"></param> 
''' <returns></returns> 
''' <remarks></remarks> 
Public Function Deserialize(Of T)(ByVal sFileName As String) As T 
    ' Exceptions are handled by the caller 

    Using oStream As Stream = File.Open(sFileName, FileMode.Open, IO.FileAccess.Read) 
     If oStream IsNot Nothing Then 
      Return DirectCast((New SoapFormatter).Deserialize(oStream), T) 
     End If 
    End Using 

    Return Nothing 
End Function 

당신은 다음과 같이 호출 할 수있는 : 또한

Public Class Foo 
    public var as string 

    public Shared Function Load(byval filename as string) As Foo 
     'This is done 
     [...] 
     oItem = [...] 'Code to deserialize 

     Return oItem 
    end sub 
end class 

Public Sub Main 
    Dim f as Foo 
    f = Foo.load("myFile") 
end sub 

, 오히려 각 클래스에 직접 직렬화를 내장하는 대신 같은 범용 방법을 가질 수 있습니다 :

Public Sub Main 
    Dim f as Foo 
    f = Deserialize(Of Foo)("myFile") 
end sub 
+0

나는 기본적으로 현재 공유 기능이 아니라는 점을 제외하고는 (어느 쪽이라도 상관 없습니다). 가능하다면 f = 부분을 피하고 싶습니다. – John

+0

@ 존 : 안타깝게도 객체를 새로운 버전의 객체로 설정할 수는 없으며 어떤 시점에서 속성을 할당해야하므로'f ='가 필요할 것입니다. 나는 당신을 위해 더 잘 작동 할 수있는 제네릭 기반 구현으로 대답을 업데이트했다. –