1

假设我有一个这样定义的结构

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 代码来读取数据块,并认为这是一种“好”的方法。

4

2 回答 2

1

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

就个人而言,我更倾向于使用专用的跨平台序列化程序!

于 2012-08-10T21:17:58.130 回答
0

如果你想序列化/反序列化结构

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

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

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

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

就像class一样,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)
    {
    }
}

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

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

于 2012-08-10T21:16:05.300 回答