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

时间:2012-08-10 21:10:49

标签: c#

假设我有一个结构定义为

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

2 个答案:

答案 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)
    {
    }
}

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

Why are mutable structs “evil”?