2017-05-23 5 views
0

Catel 4.4.0 사용.Catel : SavableModelBase.Load가 실패하면 어떻게 알 수 있습니까?

로드 (스트림, XML 모드) 메소드를 사용하여 사용자가 SavableModelBase 서브 클래스 인스턴스 (모델 ABC)의 데이터 인 데이터 파일을 찾아보고로드 할 수있게했습니다. 이 사용자는 실수를했는데 SavableModelBase 하위 클래스이지만 완전히 다른 모델 (모델 XYZ) 인 잘못된 파일을로드했습니다. 코드는 데이터를 비 직렬화하는 동작을 거쳤지 만 반환되는 인스턴스 (모델 ABC)에 속성의 기본값 만 포함되도록 모델 ABC의 속성 중 아무 것도 발견되지 않았습니다.

Load 메서드가 null 값을 반환하거나 예외를 발생 시키길 바랬습니다. 새로운 모델 ABC의 인스턴스를로드하는 것과 실제적으로 기본 속성 값이있는 모델을로드하는 것과 모델 XYZ를 모델 ABC로로드하려고 우연히 시도하는 것의 차이를 어떻게 결정합니까? 가능한 믹스 업에 대해 알려주는 SavableModelBase의 속성을 보지 못했습니다.

Loadable 오류를 결정하는 데 도움이되는 SaveableModelBase에 기본 제공되는 것이 있습니까? 아니면 어떤 종류의 해결 방법이 필요합니까?

자세한 정보가 필요하면 알려 주시기 바랍니다. 감사! 랜디

답변

0

고유 한 Load 메소드를 사용하여 SavableModelBase의 하위 클래스를 만들기로 결정했습니다. 이 Load 메서드는 먼저 파일을 저장하는 클래스의 이름과 같은 이름을 가진 파일의 루트 노드를 읽습니다. 그들이 OK를 비교한다면, 부모 SavableModelBase 클래스 Load 메소드로 로딩을 재개하십시오. 그렇지 않으면 예외를 throw합니다.

public class LexSavableModelBase<T> : SavableModelBase<T> where T : class 
{ 
    // SNIP! 

    public static new T Load(Stream stream, SerializationMode mode) 
    { 
     Argument.IsNotNull(() => stream); 

     if (mode == SerializationMode.Xml) 
     { 
      using (XmlReader xr = XmlReader.Create(stream)) 
      { 
       xr.MoveToContent(); 
       string rootName = xr.LocalName; 
       if (string.Compare(rootName, typeof(T).Name, StringComparison.OrdinalIgnoreCase) != 0) 
       { 
        throw new InvalidDataException(string.Format(CultureInfo.CurrentCulture, "Expecting data from Model [{0}], but found Model [{1}] instead.", typeof(T).Name, rootName)); 
       } 

       // Reset to read from the top. 
       stream.Seek(0, SeekOrigin.Begin); 
      } 
     } 

     return SavableModelBase<T>.Load<T>(stream, mode); 
    } 
} 

확실 해요 두 번 파일의 일부를 읽을 필요에 대한 성능 저하가 (그리고 난.이 시간에 바이너리 모드 로딩을 ​​무시 해요)와 나는 단지 충족하기에 충분하고있어 내 시나리오의 작은 세트,하지만 그것은 내가 필요로하는 것으로 보인다 - 잘못된 데이터가 로딩을 위해 제시 될 때를 감지하십시오. 나는 나의 어플리케이션에서 가지고있는 150 가지 이상의 4 가지 모델에 대해서만 이것을 사용하고 있습니다. 이 파일은 고객이 디스크에 저장하고 파일에서로드하는 파일입니다.

개선 할 사항이 있으면 알려주세요. 궁금한 점이 있으면 알려주세요.

0

클래스는 (비) 여러 가지 형식을 직렬화 (심지어 XML 구조를 변경 포함) 할 수 있기 때문에,이 실패 할 경우 볼 수있는 실제적인 방법이 없습니다. 이 경우 필자는 필요한 속성을 확인하거나 다른 방식으로로드하려는 각 유형에 대해 다른 파일 유형 확장자를 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 일할지도 모른다 생각이있다. 그것이 (또는 그렇지 않더라도), 나는 내가 한 일로 여기에 다시 올릴 것입니다. – RandyB