2012-05-25 3 views
2

플러그인 아키텍처가있는 응용 프로그램이 있습니다. 플러그인에는 기본 데이터 인터페이스 IPluginDataStorage에서 상속되는 자체 데이터 컨테이너가 있습니다. 상태를 유지하기 위해 직렬화되는 DataStorage 객체에는 다른 데이터와 함께 이러한 하위 클래스의 목록이 포함됩니다. DynamicType 플래그는 실행될 때까지 어떤 플러그인이 사용 중인지 알 수 없으므로 true로 설정됩니다.protobuf.net을 사용하여 누락 된 유형을 비 직렬화

[Serializable] 
[ProtoContract] 
public class DataStorage 
{ 
    [ProtoMember(200, DynamicType = true)] 
    public List<IPluginDataContainer> PluginDataStorage { get; set; } 

이 설정을 직렬화해도 문제가 없지만 목록을 확실하게 비 직렬화하는 데 문제가 있습니다. 직렬화 될 때 사용 된 모든 플러그인에 액세스하지 않고 객체를 deserialize하려고하면 자연스럽게 누락 된 유형에 대한 예외가 발생합니다.

유형 확인할 수 없습니다 : NOSMemoryConsumptionPlugin.NOSMemoryConsumptionData, NOSMemoryConsumptionPlugin, 버전 = 1.2.0.17249을, 문화 = 중립, PublicKeyToken = null이

(사용자 정의 매핑을 제공하기 위해 TypeModel.DynamicTypeFormatting 이벤트를 사용할 수 있습니다)

예외는 이벤트를 통해 형식을 제공 할 수 있다는 힌트를 제공하지만 사용 가능한 유형이 없다는 점이 문제의 도움이 될 수는 없습니다. 이 경우 내가하고 싶은 것은 객체를 비 직렬화하는 것을 완전히 무시하는 것입니다. 이 경우 목록 항목은 기본 클래스의 더미 인스턴스로 기본 설정 될 수도 있습니다. 그러나 이것을하는 방법?

답변

1

(건너 뛰기 또는 기본값 선택)은 내가 완전히 고려했다고 생각하지 않는 매혹적인 사용 사례입니다. 그러나, 당신은 아마를 통해이 직접 수행 할 수 있습니다

public class NilContainer : IPluginDataContainer {} 

다음 DynamicTypeFormatting 이벤트에 가입; 유형을 인식하지 못하면 typeof(NilContainer)을 입력하십시오.

RuntimeTypeModel.Default.DynamicTypeFormatting += (sender, args) => 
{ 
    Type type; 
    if(!yourTypeMap.TryGetValue(args.FormattedName, out type)) 
    { 
     type = typeof (NilContainer); 
    } 
    args.Type = type; 
}; 

(완전히 테스트되지 않은)

+0

슬프게도이 작동하지 않습니다. 형식을 제공하면 InvalidOperationException이 발생합니다. "형식이 예상되지 않고 계약을 유추 할 수 없습니다 : MemoryAnalyzer.NilContainer" –

관련 문제