【问题标题】:How to overwrite one object in a binary file?如何覆盖二进制文件中的一个对象?
【发布时间】:2016-03-25 23:03:17
【问题描述】:

在这种情况下,我必须专门通过二进制文件进行用户注册,所以很遗憾,我必须这样做。 C#。

我设置了用户注册,以便将用户对象附加到 .bin 文件的末尾。用户登录将这个文件中的所有用户放入一个列表中,并搜索具有相同用户名和密码的用户。但是,我希望我的用户能够编辑他们的个人资料,所以我想要一个可以将他们的对象重新保存到文件中的功能。这就是我现在所拥有的:

BinaryFormatter bFormatter = new BinaryFormatter();
using (Stream bFile = File.Open("../../data/UserData.bin", FileMode.Append))
{
    bFormatter.Serialize(bFile, Settings.User);
}

当然,尽管这只会将更新的对象附加到文件的末尾,但会留下同一对象的 2 个版本?任何人对如何进行此操作有任何建议,以便更新二进制文件中的现有对象?

【问题讨论】:

  • 最简单的方法是让每个用户记录完全相同的大小。然后很容易在文件中的用户记录之间进行查找(userIndex * recordSize)。否则,您将不得不在索引等方面做大量工作,或者每次编辑时都重写整个文件。
  • 你能反序列化 UserData 文件,更改用户对象,然后序列化整个东西吗?也就是说,用新序列化的版本覆盖之前的文件?
  • 如何使它们的尺寸相同?
  • 我知道你说过你必须这样做,但真的吗?你真的必须那样做吗?因为它没有多大意义。就个人而言,我会使用 SQL-CE 数据库。但这很容易在不了解上下文的情况下说出来。

标签: c# object serialization binaryfiles


【解决方案1】:

你有几个选择:

1)如果您知道该用户对象的特定字节数将始终保持不变,那么只需用新数据覆盖这些特定字节即可。

2) 如果每条记录使用并存储在文件中的每个字节数可以更改,那么您可以用零或空值覆盖特定用户记录(字节)并附加新记录。您的文件大小将继续增加。

3) 如果每条记录使用并存储在文件中的每个字节数可以更改,则读回所有数据,对其进行修改并创建一个新的“.bin”文件。

4) 如果每个用户记录都是固定大小,则只需覆盖这些字节(即在文件中找到起始位置并覆盖 x 个字节。

【讨论】:

  • 很多个选项比那些少数(在处理原始数据级别时),但对于初学者..
猜你喜欢
  • 2011-11-09
  • 2021-09-25
  • 2017-09-27
  • 1970-01-01
  • 2013-02-06
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
相关资源
最近更新 更多