C# binaryformatter- 이진 데이터의 클래스를 어떻게 알 수 있습니까?
-
03-07-2019 - |
문제
나는 물체를 사로화하고 싶지만 클래스를 미리 모르고 싶지 않다. 따라서 다음 코드를 고려하십시오 ...
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject)formatter.Deserialize(stream);
수업을 앞선 모르는 경우 어떻게해야합니까? 예를 들어 "myfile.bin"은 myobject 또는 myfoo였습니다. 인스턴스화 할 객체를 어떻게 결정합니까?
... 같은 ...
if (magic happens here == typeof(MyObject))
MyObject obj = (MyObject) formatter.Deserialize(stream);
else if (more magic happens here == typeof(MyFoo))
MyFoo foo = (MyFoo)formatter.Deserialize(stream);
해결책
그냥 해:
object result = formatter.Deserialize(stream);
Type t = result.GetType();
다른 팁
주로 Leppie가 말했듯이 ...
알려진 몇 가지 유형에 대해 테스트하려면 "/"as "를 사용할 수 있습니다.
MyFoo foo = result As MyFoo;
if(foo != null) { // it was one of those
// special code
}
그러나 일반적으로, 당신은 시리얼 라이저가 그러한 세부 사항에 대해 걱정하게 할 것입니다 ...
물론 XML 기반 시리얼 라이저와는 매우 다릅니다. 물론 직렬 라이저가 무엇을 얻었는지 알려주는 것이 아니라 예상되는 내용을 알려야하기 때문입니다.
몇 가지 제안,
객체를 캐스팅하지 않고 객체를 제조하는 경우 myobject = formatter.deserialize (stream); 그런 다음 "AS"연산자를 사용하여 알려진 유형에 대한 유형 호환성을 확인한 다음 작동 할 수 있습니다.
SerializationBinder 유형 인 Binaryformatter.binder 속성을 살펴보면 이전 버전의 파일 형식에 대한 후진 호환성을 수행하기 전에 사용했으며 훌륭하게 작동했습니다. 기본적으로 무언가가 사형화되는 것을 완전히 제어 할 수 있습니다.
제휴하지 않습니다 StackOverflow