2017-05-23 32 views
0

使用Catel 4.4.0。Catel:我如何知道SavableModelBase.Load何時失敗?

我讓用戶使用Load(流,XML模式)方法瀏覽並加載他的數據文件,該文件是來自SavableModelBase子類實例(模型ABC)的數據。該用戶犯了一個錯誤,並加載了錯誤的文件,這也是一個SavableModelBase子類,但是完全不同的模型(模型XYZ)。代碼經歷了反序列化數據的動作,但是當然,沒有找到ABC模型的屬性,因此返回的實例(模型ABC)僅包含屬性的默認值。

我希望Load方法會返回空值或引發異常。如何確定加載模型ABC的實例(它是全新的並因此具有默認屬性值)並意外嘗試將模型XYZ加載爲模型ABC之間的區別?我沒有看到SavableModelBase的任何屬性,它會提醒我可能的混合。

是否有內置的SaveableModelBase可以幫助我確定加載錯誤還是需要提出某種解決方法?

如果您需要更多信息,請讓我知道。謝謝!

蘭迪

回答

0

我決定用自己的Load方法創建一個SavableModelBase子類。此Load方法將首先讀取與保存該文件的類的名稱相同的文件的根節點。如果它們比較OK,則繼續使用父SavableModelBase類的Load方法加載。否則,拋出一個異常。 (我在這個時候忽略使用二進制模式加載。)

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

相關問題