【发布时间】:2021-03-04 10:29:39
【问题描述】:
我正在尝试编辑二进制文件中的一些记录,但我似乎无法掌握它。
我可以读取文件,但是找不到我想要编辑记录的位置,所以我可以替换。
这是我目前的代码:
public MyModel Put(MyModel exMyModel)
{
List<MyModel> list = new List<MyModel>();
try
{
IFormatter formatter = new BinaryFormatter();
using (Stream stream = new FileStream(_exMyModel, FileMode.Open, FileAccess.Read, FileShare.Read))
{
while (stream.Position < stream.Length)
{
var obj = (MyModel)formatter.Deserialize(stream);
list.Add(obj);
}
MyModel mymodel = list.FirstOrDefault(i => i.ID == exMyModel.ID);
mymodel.FirstName = exMyModel.FirstName;
mymodel.PhoneNumber = exMyModel.PhoneNumber;
// Now I want to update the current record with this new object
// ... code to update
}
return phoneBookEntry;
}
catch (Exception ex)
{
Console.WriteLine("The error is " + ex.Message);
return null;
}
}
我真的被困在这里了,伙计们。任何帮助将不胜感激。
我已经检查了这些答案:
提前谢谢你:)
【问题讨论】:
-
你不能替换序列化流上的字符串值,除非至少重写该记录和 all 记录,因为长度可能已经改变。为什么不直接使用 DB?
-
这真的很重要:不要使用
BinaryFormatter。几乎从来没有。这是非常危险的,它会伤害你——唯一的问题是“何时”。当前的 .NET 版本(即:.NET 5、.NET Core 等)也不支持它 -
“我只有 2 小时的时间来交付” - 你想要做的事情需要从根本上重新考虑你正在做的 what - 这似乎不仅仅是 2对我来说小时问题(我对二进制序列化“有点熟悉”)
-
BSON 是 JSON 的二进制等价物,这使得序列化相对容易。协议缓冲区是另一种类似的格式。 HDF5 是允许修改的大型数据集的二进制格式。类似的大数据格式有 Avro、Orc 和 Parquet。有了大数据,你无法通过重写文件来修改记录,甚至无法读取整个文件来查找记录
-
“更好”是主观的和上下文的;但是,几乎任何东西都比使用
BinaryFormatter更好;存在一系列支持良好的序列化框架,使用多种格式——文本和二进制;但是编辑文件的中间而不重写之后的所有内容:需要认真的设计
标签: c# asp.net .net asp.net-core binaryfiles