-1

我有一些關於如何正確執行文件處理的問題。我在我的程序中使用二進制序列化和反序列化。最重要的是,我還導出和導入文本文件。我列出了我的序列化代碼下面的一個例子。 我使用開放文件對話框來選擇文件夾/文件。什麼是在C#中的文件處理的最佳做法?

這是我的二進制序列化方法:

if (string.IsNullOrWhiteSpace(fileName)) 
{ 
    throw new ArgumentOutOfRangeException("fileName"); 
} 

FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate); 

try 
{ 
    BinaryFormatter binaryFormatter = new BinaryFormatter(); 
    binaryFormatter.Serialize(fileStream, Animals); 
} 
finally 
{ 
    fileStream.Close(); 
} 

而這些都是我捕捉到的異常:

try 
{ 
    administration.Load(fileName); 
} 
catch (NotSupportedException nonSupportedException) 
{ 
    MessageBox.Show(nonSupportedException.Message); 
} 
catch (UnauthorizedAccessException unauthorizedAccesException) 
{ 
    MessageBox.Show(unauthorizedAccesException.Message); 
{ 
catch (SecurityException securityException) 
{ 
    MessageBox.Show(securityException.Message); 
} 
catch (DirectoryNotFoundException directoryNotFoundException) 
{ 
    MessageBox.Show(directoryNotFoundException.Message); 
} 
catch (IOException IOException) 
{ 
    MessageBox.Show(IOException.Message); 
} 

我趕上解串同樣的例外。唯一的區別是這3行:

if (File.Exists(fileName)) { } 
FileStream fileStream = new FileStream(fileName, FileMode.Open); 
Animals = formatter.Deserialize(fileStream) as List<Animal>; 

如果我得到錯誤的數據,該怎麼辦?例如:文件的一半有正確的數據,另一半沒有。

我應該如何編寫序列化單元測試?像SecurityException這樣的很多異常都很難測試。

我應該捕捉哪些異常?我看着MSDN,但我不確定是否應該直接抓住列出的所有例外情況。例如,我故意不抓住ArgumentOutOfRange異常,因爲我不想捕捉編程錯誤。

我對閱讀和編寫文本文件有同樣的問題。在測試/異常捕獲方面有差異嗎?唯一的區別是我使用StreamWriter來編寫文本文件。我使用File.ReadAllLines來讀取我選擇的文本文件。

謝謝。

+0

爲了100%誠實,您的所有問題似乎都是您或您的最終用戶/客戶需要回答的要求。至於編寫測試序列化:http://stackoverflow.com/questions/236599/how-to-unit-test-if-my-object-is-really-serializable –

回答

1

你的問題不太適合堆棧溢出,因爲你的需求在很大程度上取決於你沒有告訴過我們的東西,並且可能還不知道自己。您必須詢問您的客戶想要什麼,找出simplest thing that could possibly work,將其發送給您的客戶,讓他們嘗試一下,然後將修復內容納入下一次迭代。不要以爲你可以提前設計一切,你的第一次嘗試將是完美的。

Using binary serialization for data files is a mistake。該格式記錄不完整,可能會有變化。你不能在其他平臺上使用它,甚至不能在同一個平臺上使用不兼容的框架。它對分層數據結構的性能也很差。如果您的需求很簡單,請從文本JSON或XML文件開始。如果您有複雜數據或需要強制執行數據一致性,則應使用SQL。

這樣的代碼通常是錯誤的:

catch (NotSupportedException nonSupportedException) 
{ 
    MessageBox.Show(nonSupportedException.Message); 
} 

catch是固定的錯誤和MessageBox.Show不能解決任何錯誤;它隱藏錯誤,然後繼續,就好像沒有任何錯誤。但有些事情出錯了;你需要弄清楚並修復它。如果你不能解決它,那麼不要抓住錯誤;讓封閉的方法來處理它。

相關問題