2017-05-23 3 views
0

Verwenden von Catel 4.4.0.Catel: Woher weiß ich, wenn SavableModelBase.Load fehlschlägt?

Ich lasse den Benutzer durchsuchen und laden seine Datendatei, die Daten aus einer SavableModelBase-Unterklasse-Instanz (Modell ABC) mit dem Laden (Stream, XML-Modus) -Methode. Dieser Benutzer hat einen Fehler gemacht und die falsche Datei geladen, die ebenfalls eine SavableModelBase-Unterklasse ist, aber ein völlig anderes Modell (Modell XYZ). Der Code durchlief die Deserialisierung der Daten, aber natürlich wurde keine der Eigenschaften des Modells ABC gefunden, so dass die zurückgegebene Instanz (Modell ABC) nur die Standardwerte der Eigenschaften enthielt.

Ich hatte gehofft, die Load-Methode würde entweder einen Nullwert zurückgeben oder eine Ausnahme auslösen. Wie ermittele ich den Unterschied zwischen dem Laden einer Instanz von Modell ABC, die brandneu ist und daher wirklich Standardeigenschaftswerte hat und versehentlich versucht, das Modell XYZ als Modell ABC zu laden? Ich habe keine Eigenschaften von SavableModelBase gesehen, die mich auf das mögliche Verwechseln hinweisen würden.

Ist in SaveableModelBase etwas eingebaut, das mir helfen würde, einen Ladefehler zu ermitteln, oder muss ich eine Art Workaround einleiten?

Wenn Sie weitere Informationen benötigen, lassen Sie es mich bitte wissen. Vielen Dank!

randy

Antwort

0

Ich entschied mich, eine Kindklasse von SavableModelBase mit einer eigenen Load-Methode zu erstellen. Diese Load-Methode würde zuerst den Wurzelknoten der Datei lesen, der denselben Namen wie der Name der Klasse hat, die die Datei speichert. Wenn sie OK vergleichen, setzen Sie das Laden mit der übergeordneten SavableModelBase-Klasse Load-Methode fort. Andernfalls eine Ausnahme auslösen. (Und ich ignoriere Laden mit Binär-Modus zu diesem Zeitpunkt.)

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); 
    } 
} 

Ich bin sicher, es gibt eine Leistungseinbuße für die einen Teil der Datei zweimal zu lesen und ich tue nur genug zu erfüllen meinem kleine Reihe von Szenarien, aber es scheint zu tun, was ich brauche - zu erkennen, wenn die falschen Daten zum Laden vorgestellt werden. Ich verwende das nur für ungefähr 4 Modelle der 150+, die ich in meinen Anwendungen habe. Dies sind diejenigen, die vom Kunden auf Dateien auf der Festplatte gespeichert und von diesen geladen werden.

Wenn Sie irgendwelche Verbesserungen machen können, tun Sie bitte. Und lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.

0

Da die Klasse kann (de) serialisiert werden verschiedene Formate (auch mit XML-Strukturen zu verändern), gibt es keine wirkliche Möglichkeit, zu sehen, ob dies fehlgeschlagen. In diesem Fall würde ich die erforderlichen Eigenschaften überprüfen und/oder für jeden Typ, den Sie auf andere Weise laden möchten, eine andere Dateityperweiterung verwenden.

+0

Danke für die Antwort! Ich habe eine Idee, die funktionieren könnte. Wenn es das tut (oder auch wenn es nicht so ist), werde ich hier mit dem, was ich getan habe, posten. – RandyB

Verwandte Themen