【问题标题】:C# file won't saveC# 文件不会保存
【发布时间】:2014-12-10 18:39:36
【问题描述】:

保存或读取文件,有什么问题?

这会创建空文件。

我很困惑,请告诉我如何正确地做到这一点。如您所见,我正在尝试保存一个类,然后读回它们的数组。

public void savePlayers()
{
    string path = @"scores.dat";

    if (File.Exists(path))
    {
        File.Delete(path);
    }

    try
    {
        using (FileStream fs = File.Create(path))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(fs, player.players);
            fs.Close();
        }
    }
    catch
    {
        MessageBox.Show("Failed to save data", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

public void readPlayers()
{
    string path = @"scores.dat";

    player.players.Clear();
    try
    {
        using (FileStream fs = File.OpenRead(path))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            player.players.Add((Player)formatter.Deserialize(fs));
            fs.Close();
        }
    }
    catch
    {
        MessageBox.Show("Failed to read stats file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

【问题讨论】:

  • 仅供参考 fs.Close(); 是不必要的。将流包装在 using 语句中会为您解决这个问题。为了解决您的问题,它可能会保存为空,因为您保存的是空的。我假设formatter 的类型是XmlSerializer?你能分享那是什么吗?你能分享一下players.players 是什么并展示你是如何填充它的吗?如果您遇到异常,您的文件将被创建但为空。你有例外吗?您还需要表明您正在调用这些方法。
  • @tnw: formatter 的类型是 BinaryFormatter,而不是 XmlFormatter...
  • @Sjips 哎呀,不知道我是怎么错过的。谢谢。我的其余评论仍然有效:)

标签: c# winforms binary-serialization


【解决方案1】:

您正在保存一个player.players 收藏,并尝试加载单个播放器 (player.players.Add((Player)formatter.Deserialize(fs));)。这是不正确的。

这取决于您必须在加载端 (Deserialize) 还是在保存端 (Serialize) 修复此问题。

// Saving
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, player.players.Count); // or Count(), Length, depends on your list, collection,...
for each (Player pl in player.players)
{
  formatter.Serialize(fs, pl);
}
fs.Close();

// Loading
BinaryFormatter formatter = new BinaryFormatter();
int count = (Int32) formatter.Deserialize(fs);
for (int i = 0; i < count; i++)
{
  player.players.Add((Player)formatter.Deserialize(fs));
}
fs.Close();

并且Player类必须标记为[Serializable],请检查它是否有这个属性。

【讨论】:

  • 我认为您必须先保存集合计数,然后再对集合中的每个项目进行序列化。在加载方面,首先反序列化计数,然后在 for 循环中使用该数字来反序列化项目并将它们添加到您的集合中。我将尝试添加示例...
  • 你的Player 类有[Serializable] 属性吗?
猜你喜欢
  • 2018-07-22
  • 2021-07-31
  • 1970-01-01
  • 2015-04-11
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
相关资源
最近更新 更多