所以我目前正在尝试将数据从结构写入二进制文件并且运气不好,我只是想知道是否有人能指出我可能需要实现的正确方向我尝试过和研究过的都没有成功。以下是试图证明我的问题的非常基本的框架代码。
谢谢!
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();
}
}
}
答案 0 :(得分:0)
如果你在谈论原始内存副本,那么你总是需要一些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
)。序列化库处理了一些可能对您来说并不感兴趣的复杂性很多:)