c#中文件处理的最佳实践是什么?

时间:2017-04-05 18:12:57

标签: c# serialization exception-handling deserialization file-handling

关于如何正确处理文件,我有几个问题。我在程序中使用二进制序列化和反序列化。最重要的是,我还导出和导入文本文件。我列出了下面的序列化代码示例。 我使用openfile对话框来选择文件夹/文件。

这是我的二进制序列化方法:

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来读取我选择的文本文件。

谢谢。

1 个答案:

答案 0 :(得分:1)

你的问题并不适合Stack Overflow,因为你的要求很大程度上取决于你没有告诉我们的事情,而且可能还不了解你自己。您必须询问客户他们想要什么,找出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不修复任何错误;它隐藏错误然后继续,好像什么都没有出错。但事情确实出了问题;你需要弄清楚什么并修复它。如果你无法解决它,那么不要抓住错误;让封闭的方法处理它。