2010-04-05 1 views
3

다른 경우에는 어셈블리 유형에서 버전을 제거하는 SerializationBinder를 추가하는 것이 좋습니다. 그러나 서명 된 어셈블리에있는 형식의 제네릭 컬렉션을 사용할 때는 해당 어셈블리를 기반으로 해당 버전이 엄격하게 버전이 지정됩니다.다른 버전의 서명 된 어셈블리로 작성된 제네릭을 deserialize하는 가장 좋은 방법은 무엇입니까?

다음은 내가 발견 한 것들입니다.

그러나 바인딩 프로세스가 전체적으로 변경되는 것은 다소 위험한 것으로 보입니다. 여러 스레드에서 직렬화가 발생하면 이상한 일이 발생할 수 있습니다. 아마도 더 나은 솔루션은 typeName에 대한 일부 정규식 조작을 수행하는 것입니다.

편집 : 문자열 기반 방법이 작동하지 않습니다. Generics는 분명히 강하게 이름 붙여진 유형을 필요로합니다. 네가 나 한테 묻는다면 아주 가증 스럽다.

+0

빠른 참고 : 내 특별한 경우의 특성으로 인해 .NET 2.0 이하의 외부에서 직렬화를 사용할 수 없습니다. –

+0

app.config 파일에서' '를 사용하는 것이 더 안전하고 코드가 필요하지 않습니다. –

+0

이것은 널리 배포 된 라이브러리에서 사용되므로 app.config에서 제어 할 수 없습니다. –

답변

2

AssemblyResolve 이벤트는 일반 바인딩에 실패 할 경우에만 발생합니다. 따라서 정상적인 방법으로 해결할 수있는 것은 무엇이든 될 것입니다. deserialization 작업 만이 이벤트를 발생시킬 수 있으며 이러한 문제를 해결하기위한 완벽하게 유효한 전략이 있습니다.

프로그램을 시작하고 추가하거나 제거하지 않고 AssemblyResolve 이벤트 처리기를 추가하면됩니다. 이로 인해 멀티 스레딩 문제의 잠재적 인 원인이 제거됩니다.

+0

이벤트 제거는 스레드로부터 안전하지 않습니까? 이 경우 아마도 AssemblyResolve에 가드를 추가하여이 어셈블리에만 사용되도록해야합니다. –

0

전체 컬렉션을 직렬화하는 대신 컬렉션을 반복하고 각 요소를 개별적으로 직렬화 할 수 있습니까? 그런 다음 SerilizationBinder 방식을 사용할 수 있습니다.

+0

그러나이 경우 새 필드가 일련 화되도록 유지 관리 오버 헤드가 추가됩니다. 나는 ISerializable을 수동으로 구현하는 것을 피하려고 노력했다. 이미 자동적으로 하위 호환성 테스트가 있습니다. –

0

이 귀하의 질문에 대답해야합니다 SerializationBinder with List<T>

SerializationBinder.BindToType의 일반적인 유형을 사용하는 대신 정규화 된 형식 이름의 약한 유형 이름을 사용해야합니다.

관련 문제