2010-03-19 5 views
3

복제 작업을 위해 serialization을 사용할 계획입니다. 나는 클래스를 ISerializable로 만들어야한다. 하지만 수퍼 클래스와 참조 된 모든 변수 클래스는 어떻습니까? 나는 그들을 모두 ISerializable로 만들 필요가 있습니까?C# ISerializable question

ISerializable을 사용하는 경우. GetObjectData()를 구현해야하는데, 그 메소드 안에 무엇을 넣어야합니까? 비워 둬라. 괜찮 니? 당신이 [직렬화] 속성을 가진 클래스를 표시하지 않는 한

답변

9

이 인터페이스는 직렬화 된 인스턴스와 모든 클래스에서 구현해야합니다. 클래스가 자체적으로 직렬화 및 직렬화 해제를 제어하려는 경우 ISerializable 인터페이스를 사용하십시오.

GetObjectData()를 사용하면 직렬화 프로세스를 제어 할 수 있습니다.

GetDataObject은, 어떤 당신은 하여 SerializationInfo 개체와 StreamingContext 객체를 전달합니다. GetDataObject 메서드는 대상 개체의 직렬화에 필요한 데이터로 SerializationInfo 개체 을 채 웁니다.

예 :

public Employee(SerializationInfo info, StreamingContext ctxt) 
{ 
    //Get the values from info and assign them to the appropriate properties 
    EmpId = (int)info.GetValue("EmployeeId", typeof(int)); 
    EmpName = (String)info.GetValue("EmployeeName", typeof(string)); 
} 

public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
{ 
    //You can use any custom name for your name-value pair. But make sure you 
    // read the values with the same name. For ex:- If you write EmpId as "EmployeeId" 
    // then you should read the same with "EmployeeId" 
    info.AddValue("EmployeeId", EmpId); 
    info.AddValue("EmployeeName", EmpName); 
} 

위의 예제는 어떻게 직렬화 및 직렬화하는 방법을 보여줍니다. 보시다시피 GetObjectData는 deserialize해야합니다. 당신이 그것을 비워두면, 당신의 목표는 욕망의 가치를 가지지 못할 것입니다.

+0

내가하려고하는 것은이 접근법을 사용하여 복제를 수행하는 것입니다. http://stackoverflow.com/questions/78536/cloning-objects-in-c. 모든 GetObjectData 메서드를 정의해야한다면 내 자신의 Clone 메서드를 정의하는 것이 좋습니다. – 5YrsLaterDBA

+0

클래스 위에 [Serializable] 태그를 추가하기 만하면됩니다. 이 방법은 객체를 직렬화 할 수 있습니다. 나에게 보낸 링크에서와 같이 Clone() 메소드를 사용하면 비즈니스에 있어야합니다. –

+0

코드 및 기타 텍스트가 "GetObjectData"인 반면, blockquote는 "GetDataObject"를 사용합니다. 이 두 가지 별도의 메소드입니까, 아니면 그냥 오타입니까? –

3

.Net에서 유형을 이진 직렬화 할 수있는 두 가지 방법이 있습니다.

가장 간단하고 쉬운 방법은 유형에 태그를 지정하는 것입니다.이 유형에는 계층 구조의 모든 관련 유형과 해당 유형의 모든 필드 유형에 Serializable 속성이 있습니다. 이것은 많은 것처럼 보이지만 작은 객체 계층 구조에서는 상대적으로 빠르게 수행 할 수 없습니다. 이 접근 방식에 대해 좋은 점은 비록 실제로 직렬화를 위해 다른 작업을 수행 할 필요가 없다는 점입니다. 당신은 단순히 형식을 serializable로 선언하고 CLR은 나머지 작업을 수행합니다.

다른 방법은 ISerializable을 계층 구조의 모든 유형에 구현하는 것입니다. 그러나이 모든 것은 당신의 타입이 직렬화 가능하다고 선언하는 것입니다. 실제로 값을 직렬화하려면 ISerializable에 메소드를 구현해야합니다. 일반적으로이 접근법은 필드가 추가되거나 제거 될 때 지속적으로 업데이트해야하므로 유지 관리 비용이 추가되고 작업이 훨씬 더 많이 소요됩니다. 계층 구조의 모든 유형을 제어하지 않아도 될 수 있습니다.

ISerializable을 사용해야하는 구체적인 이유가없는 경우가 아니면 Serializable 속성 경로로 이동합니다.