我正在尝试将游戏地图/模型文件的内容读入程序,以便编写小型模型查看器并测试一些DirectX功能。模型/映射文件格式本质上是分块的,我知道这些文件的格式。我可以通过解析各个块来轻松读取文件,使用如下方法:
class FileType1 {
private Chunk1 c1;
private Chunk2 c2; // etc
public void Read(BinaryReader reader) {
c1 = new Chunk1(reader);
c2 = new Chunk2(reader);
}
}
但是,我试图通过指定文件所遵循的格式(即Chunk1后跟Chunk2等等)来考虑一般读取这些文件的方法,以便读者可以确保文件具有适当的结构。我可以使用Chunk超类和Chunk工厂来一般读取任何给定文件中的所有块。基本上,我想用结构验证器(或类似的东西)的附加功能来增加它,以产生类似于此的方法:
public void Read(BinaryReader reader, ChunkFileFormat format) {
while (!EOF) {
char[] chunkID = reader.ReadChars(4);
Chunk c = chunkFactory.Create(chunkID);
if (c.GetType() != format.Next.GetType())
throw new Exception("File format is invalid");
format.SetCurrentRecord(c);
}
}
这里的想法是ChunkFileFormat类指定文件的结构,指示下一个从二进制流中读入的块类型。这将允许ChunkFileFormat的子类指定该特定格式的布局,并且单个读取方法可用于读取所有不同的分块文件格式,而不是为每个格式编写冗长且重复的方法。
我的问题是,是否有人知道可以应对这种情况的设计模式或方法?我正在研究的项目目前在C#中,但我对C ++(或任何语言)的解决方案感兴趣。
提前致谢!
答案 0 :(得分:2)
使用finite-state machine可以轻松编码这些规则。
每个块应该改变你所处的状态。每个状态都在等待特定的块之后。如果遇到当前不应该遇到的块,那就是错误。
答案 1 :(得分:0)
您可以使用DataScript / antlr创建格式的正式描述,并为您创建解析和I / O代码(Java或C ++)。