나는 작업중인 시스템 콜렉션에 대해 불가지론 뷰어를 작성 중입니다. 이 뷰어는 특정 시스템의 컨텍스트를 알 필요없이 내 데이터의 일반적인 구조를 보여줍니다.deserialize시 참조가 누락되면 예외를 throw하지 않음
Foo<T>
이 Foo
에서 상속되는 형식 인 Foo<T>
만 포함하는 메모리 스트림을 deserialise하려고합니다. 불가 지 한 시청자의 관점에서 내가 필요한 모든 데이터는 Foo에 있습니다. <T>
부분은 부적합합니다.
유형 T는 다른 어셈블리 (들)에 정의됩니다. 정상적인 작동 상태에서, 시스템은 분명히 적절한 모든 상황에 맞는 어셈블리를로드합니다. 문제는 뷰어를 실행할 때 상황 별 어셈블리가로드되지 않는다는 것입니다. Foo의 인스턴스를 deserialise하려고하면 참조 된 어셈블리가로드되지 않아서 분명히 예외가 발생합니다.
필요한 참조 된 어셈블리가 모두로드되어 있는지 여부를 감지하려고하므로 데이터를 deserialise 할 것인지 또는 클래스의 다른 측면에서 필요한 데이터를 재구성 할 것인지를 알 수 있습니다.
아주 간단한 예외 try/catch 블록을 사용하여이 작업을 수행 할 수 있다는 것을 알고 있지만 예외적 인 경우는 아닙니다. 나는 을 알고 있습니다.을 알게됩니다. 데이터를로드 할 때 수천 번이 아니더라도 수 백 번 발생할 것입니다. 그리고 이것은 내가 예외를 켰을 때 휴식을 취하는 것처럼 악몽을 불러 일으킬 수 있습니다. 나는 또한 "Exception - 힌트가 그 이름에있다"는 생각의 학교에 가입하고 따라서 Exception은 당신의 primary case code의 일부가되어서는 안된다.
는 -------- 편집 21/10/2013 ------------
전체 설명 예를 들어 here 볼 수 있지만, 여기에 중요한 비트는 다음과 같습니다
일반적인 정의푸 클래스 :
[Serializable]
public class Foo
{
public string Agnostic { get; set; }
}
[Serializable]
public class Foo<T> : Foo
{
public string Contextual { get; set; }
}
콘텐츠 저장 :
BinaryFormatter bf = new BinaryFormatter();
FileInfo tempFile = TempFileGetter.GetTempFile();
Foo<Bar> fooBar = new Foo<Bar>();
fooBar.Agnostic = "Agnostic";
fooBar.Contextual = "Contextual";
using (var fs = tempFile.OpenWrite())
{
bf.Serialize(fs, fooBar);
fs.Flush();
}
불가지론로드 :
내 말은BinaryFormatter bf = new BinaryFormatter();
FileInfo tempFile = TempFileGetter.GetTempFile();
using (var fs = tempFile.OpenRead())
{
Foo foo = (Foo)bf.Deserialize(fs);
Controls.DataContext = foo;
}
, 내가이 일을하지 않으려는, 거기에 아무것도 로켓 과학이 코드에 있고, 그것은 잘로드 "불가지론 자"뷰어, 참고로 상황에 맞는 뷰어를로드하는 경우지만, 우리가 항상로드 할 문맥 라이브러리를 갖지는 않을 것이기 때문입니다.
는 경우 BinaryFormatter이 정보를 포함
비 직렬화 코드 샘플을 제공해 주시겠습니까? 직렬화 코드를 변경할 수 있습니까? –
문제점을 설명하는 코드 추가 (다운로드 가능한 버전으로 완료) –