假设我有一个结构定义为
struct Student
{
int age;
int height;
char[] name[12];
}
当我读取二进制文件时,它看起来像
List<Student> students = new List<Student>();
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代码来读取数据块,并认为这是一种“好”的方法。
答案 0 :(得分:1)
AFAIK没有内置于.NET中的低级直接布局结构阅读器。您想要查看BinaryReader,依次读取每个字段?基本上,ReadInt32()两次,和ReadChars()。请特别注意字符数据的编码(ASCII?UTF8?UTF-16?)和整数的 endianness 。
就个人而言,我更关注使用专用的跨平台序列化器!
答案 1 :(得分:0)
如果要序列化/反序列化结构
如果你想读/写整个结构到二进制文件(序列化),我建议你看看
https://stackoverflow.com/a/629120/141172
或者,如果它是您的选项,请遵循@ Marc的建议并使用跨平台序列化程序。我个人建议protobuf-net恰好是@Marc写的。
如果您从任意文件格式加载
就像类一样, struct 可以有一个接受多个参数的构造函数。实际上,不为 struct 提供setter通常是明智的。这样做允许 struct 的值在构造之后被更改,这通常会导致编程错误,因为许多开发人员都不理解 struct 是值类型的事实具有价值语义。
我建议提供一个构造函数来初始化 struct ,将文件中的值读入临时变量,然后使用构造函数构建 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)
{
}
}
进一步挖掘可变结构的危险(初始化后可以改变的结构)我建议