使用C#中的结构来读取数据

假设我有一个如此定义的结构

struct Student { int age; int height; char[] name[12]; } 

当我正在阅读二进制文件时,它看起来像

 List students = new List(); Student someStudent; int num_students = myFile.readUInt32(); for (int i = 0; i < num_students; i++) { // read a student struct } 

如何编写我的结构,以便我只需要说出一些内容

 someStudent = new Student(); 

因此它将按照定义结构的顺序读取文件,并允许我根据需要使用语法来获取值

 someStudent.age; 

我可以将Student定义为一个类,并让构造函数读取数据并填充它们,但它没有getter / setter之外的任何方法,所以我认为结构更合适。

或者我使用类或结构无关紧要? 我见过其他人使用结构编写C代码来读取数据块,并认为这是一种“好”的方法。

如果要序列化/反序列化结构

如果你想读/写整个结构到二进制文件(序列化),我建议你看看

https://stackoverflow.com/a/629120/141172

或者,如果它是您的选项,请遵循@ Marc的建议并使用跨平台的序列化程序。 我个人建议protobuf-net恰好是由@Marc编写的。

如果您从任意文件格式加载

就像一个类一样struct可以有一个接受多个参数的构造函数。 实际上,通常明智的做法是结构提供setter。 这样做允许在构造结构之后更改结构的值,这通常会导致编程错误,因为许多开发人员都不理解struct是具有值语义的值类型这一事实。

我建议提供一个构造函数来初始化你的结构 ,将文件中的值读入临时变量,然后用构造函数构造结构。

 public stuct MyStruct { public int Age { get; private set; } public int Height { get; private set; } private char[] name; public char[] Name { get { return name; } set { if (value.Length > 12) throw new Exception("Max length is 12"); name = value; } } public MyStruct(int age, int height, char[] name) { } } 

进一步挖掘可变结构的危险(初始化后可以改变的结构)我建议

为什么可变结构“邪恶”?

AFAIK是一种内置于.NET中的低级直接布局结构读取器。 您想要查看BinaryReader,依次读取每个字段? 基本上,ReadInt32()两次,和ReadChars()。 要特别注意字符数据的编码 (ASCII?UTF8?UTF-16?)和整数的字节顺序

就个人而言,我更关注使用专用的跨平台序列化器!