c# 将数据从结构体写入文件
Posted
技术标签:
【中文标题】c# 将数据从结构体写入文件【英文标题】:Writing data from a structure to a file in c# 【发布时间】:2018-07-08 08:49:40 【问题描述】:所以我目前正在尝试将数据从结构写入二进制文件并且运气不佳,我只是想知道是否有人可以指出我可能需要实现的正确方向我所尝试和研究的都没有成功。下面是非常基本的骨架代码,试图演示我的问题。
谢谢!
public struct TSensor
byte b1;
int i1;
float f1;
class Program
const string fileName = "AppSettings.bin";
static void Main()
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
writer.Write();
【问题讨论】:
您忘记将要写的内容传递给writer.Write()
。你没看the documentation吗?你到底卡住了什么?
IMO 忘记 BinaryWriter
- 只是 Stream
很好。人们经常痴迷于使用BinaryWriter
,但它并非在几乎所有情况下都是正确的工具。我看看能不能举个例子……
我不确定如何将结构数据传递给编写器是我的问题。还有我正在做的事情需要它去一个二进制文件
顺便说一句:您是否考虑过任何范围广泛的序列化框架?还是您打算将其作为原始内存转储?
我对解决方案完全开放 - 我绝对会检查序列化,谢谢!
【参考方案1】:
如果您谈论的是原始内存副本,那么您总是需要一些unsafe
代码;例如:
// write
TSensor val = new TSensor b1 = 12, i1 = 14, f1 = 42.0F ;
byte[] arr = new byte[sizeof(TSensor)];
fixed (byte* ptr = arr)
Unsafe.Copy(ptr, ref val);
File.WriteAllBytes(fileName, arr);
和:
// read
byte[] arr = File.ReadAllBytes(fileName);
TSensor val = default;
fixed (byte* ptr = arr)
Unsafe.Copy(ref val, ptr);
System.Console.WriteLine(val.b1);
System.Console.WriteLine(val.i1);
System.Console.WriteLine(val.f1);
但是:这将是脆弱的变化,通常不是一个很好的解决方案。注意我使用System.Runtime.CompilerServices.Unsafe
作弊来节省一些工作。如果我们得到 IO 更新以采用Span<byte>
,那么我们可能能够通过Span<T>
的NonPortableCast<>
方法避免所有这些丑陋和作弊。但这一切还有很长的路要走。
另一种选择是手动编写序列化代码 - 即你会有类似的东西(使用BinaryWriter
):
writer.Write(val.b1);
writer.Write(val.i1);
writer.Write(val.f1);
结合(使用BinaryReader
):
val.b1 = reader.ReadByte();
val.i1 = reader.ReadInt32();
val.f1 = reader.ReadSingle();
不过,您可能会发现使用序列化库更容易;例如,Json.NET 非常流行。或XmlSerializer
。如果您有大量数据并想使用二进制文件:像 protobuf-net 这样的东西可能是一个不错的选择(我可能会强烈建议反对内置的BinaryFormatter
)。序列化库处理很多您可能不感兴趣的复杂性:)
【讨论】:
以上是关于c# 将数据从结构体写入文件的主要内容,如果未能解决你的问题,请参考以下文章
C#中怎么读取Struct(结构体)文件!!!!??救救我!!!!
C 语言文件操作 ( 学生管理系统 | 命令行接收数据填充结构体 | 结构体写出到文件中 | 查询文件中的结构体数据 )