编写没有标题的二进制文件

时间:2012-12-07 21:24:00

标签: vb.net

我经常使用二进制文件来存储可通过许多编程语言读取的数据。也在VB.Net中。当VB6创建二进制文件时,它只包含二进制数据,但是当VB.NET像这个例子中那样创建它时:

    Dim fs As New FileStream(setup_file, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
    Dim bf As New BinaryFormatter()
    bf.Serialize(fs, myStruct)
    fs.Close()

...在数据之前,系统会创建一些带有数据描述的标题。 这可能会导致以不同的编程语言和/或不同的操作系统读取此类文件时出现问题,主要是查找标题长度。

我可以以“oldfashion”的方式制作相同的文件,并且不包含任何“标题”,只是纯数据,但VB.NET程序员经常说他们强烈推荐新的风格。
这是“老式”VB6的方式:

    Dim fnum = FreeFile()
    FileOpen(fnum, setup_file, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.Shared, Len(myStruct))
    FilePut(fnum, myStruct, 1)
    FileClose(fnum)

问题是:

我可以使用FileStream,BinaryFormatter和Serialization创建/编写二进制文件,但是避免在包含数据的文件中创建标头以及如何执行此操作?

2 个答案:

答案 0 :(得分:2)

.NET反序列化器负责实例化它反序列化的对象,因此它需要知道它正在读取的数据的类型,这就是序列化器将其放在那里的原因。如果你不想那样,你必须编写自己的代码。

VB.NET程序员经常说他们推荐的是好的输入,但只有你控制双方 - 读者和作者。如果读取您编写的数据的读者有约束(例如,在Mac上运行的Objective C代码),那么您可以决定该文件的内容。

查看System.IO.BinaryWriterSystem.IO.BinaryReader。它们允许您编写没有“标题”的二进制文件,而不是您决定放在那里的文件。它仍然可能存在字节顺序和类似问题,但二进制序列化无论如何也无济于事。

答案 1 :(得分:1)

序列化对象意味着它在原始数据之外添加一些额外的信息,以便以后可以将它反序列化到同一个对象类中。如果您计划在其他平台上读取数据,那么这不是您想要的。

BinaryWriter会让你到达那里,但不会像FilePut这样方便的调用。