C# binaryformatter- 이진 데이터의 클래스를 어떻게 알 수 있습니까?

StackOverflow https://stackoverflow.com/questions/218133

  •  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 기반 시리얼 라이저와는 매우 다릅니다. 물론 직렬 라이저가 무엇을 얻었는지 알려주는 것이 아니라 예상되는 내용을 알려야하기 때문입니다.

몇 가지 제안,

  1. 객체를 캐스팅하지 않고 객체를 제조하는 경우 myobject = formatter.deserialize (stream); 그런 다음 "AS"연산자를 사용하여 알려진 유형에 대한 유형 호환성을 확인한 다음 작동 할 수 있습니다.

  2. SerializationBinder 유형 인 Binaryformatter.binder 속성을 살펴보면 이전 버전의 파일 형식에 대한 후진 호환성을 수행하기 전에 사용했으며 훌륭하게 작동했습니다. 기본적으로 무언가가 사형화되는 것을 완전히 제어 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top