2009-04-03 5 views
2

저는 serialization의 기초에 대해서만 잘 알고 있습니다. 지금은 사용하고 있습니다. ReportBase 추상 클래스 및 기본 클래스에서 파생 된 여러 보고서가있는 기존보고 시스템이 있습니다. 이것들은 각각 생성자에 지정된 다른 보고서 매개 변수와 때로는 추가 메서드를가집니다. 파생 클래스를 직렬화 한 다음 나중에 파생 클래스 유형을 모른 채 deserialize 할 수 있습니까?C# deserialize 알 수없는 추상 클래스

또는이를 달성하기 위해 리플렉션으로 할 수도 있습니다. 아마 직렬화 된 객체를 데이터베이스에 저장할 것이므로 다른 클래스에 보고서 클래스를 추가 할 수 있습니다.

답변

4

예, 실제로는 이 가능합니다. 개체의 실제 유형을 모른 채 역 직렬화 할 수 있습니다. 사실, 비 직렬화하기 위해 유형에 대해 알 필요가 없습니다. 비 직렬화는 이진 의미에서 단순히 바이트 배열을 원래 유형으로 변환하고 참조를 객체로 반환합니다. 나중에 인스턴스의 모든 합법적 인 유형으로이 값을 캐스팅 할 수 있습니다.

예를 들어 다음 코드는 스트림을 객체로 역 직렬화하여 참조를 ReportBase 유형으로 변환합니다.

public static void Deserialize(Stream stream) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    object obj = formatter.Deserialize(stream); 
    ReportBase report= (ReportBase) obj; 
} 

위의 내용은 위와 같습니다. 이 기능을 작동 시키려면 stream이 ReportBase 파생 클래스의 유효한 serialize 된 인스턴스를 가리켜 야하며 해당 클래스는 serialization 규칙을 따라야합니다.

그것은 의도 된 클래스를 만드는 것은 매우 간단하지만, 직렬화되지 않습니다 : http://blogs.msdn.com/jaredpar/archive/2009/03/31/is-it-serializable.aspx

+0

덕분에 내가 갈 줄 것입니다. 어떤 이유로 저는 Deserialize가 타입을 필요로한다고 생각했습니다. 사용했던 이후로 그 타입이 오래되었습니다. – PeteT