0

我经常使用二进制文件来存储可以通过多种编程语言读取的数据。同样在 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”方式制作相同的文件,并且那些不包含任何“header”,只是纯数据,但 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 和序列化创建/写入二进制文件,但避免在包含数据的文件中创建标头以及如何执行此操作?

4

2 回答 2

2

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

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

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

于 2012-12-07T21:38:59.930 回答
1

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

BinaryWriter将带您到那里,但不是像 FilePut 这样方便的调用。

于 2012-12-07T21:46:16.417 回答