加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

VB.NET中将结构体保存到文件的方法

发布时间:2020-12-17 00:27:03 所属栏目:大数据 来源:网络整理
导读:VB.NET中的结构体在使用的时候像是一个“小型的类”,其内部结构与VB6.0相比有许多不同。当需要把一个VB6.0中的结构体升级到对应的.NET版本时,在细节上会有很多区别。 前段时间,在将一个6.0的程序升级到.NET的过程中就遇到了很多麻烦。这个结构体中包含了

VB.NET中的结构体在使用的时候像是一个“小型的类”,其内部结构与VB6.0相比有许多不同。当需要把一个VB6.0中的结构体升级到对应的.NET版本时,在细节上会有很多区别。

前段时间,在将一个6.0的程序升级到.NET的过程中就遇到了很多麻烦。这个结构体中包含了定长字符串、数组以及其它一些结构,需要将该结构体作为头文件直接保存到一个二进制文件中,同时还要能从文件中读出该结构体。在6.0中,该结构体如下:

其中,ChanType是另一个结构体,如下:

如果只是简单的将其改写到.NET版本并不难,但若想在.NET中读出以前6.0下保存的二进制文件时,就需要好好的设计一番了。具体涉及到以下几个问题:

1、.NET中已不再直接支持6.0中的定长字符串。不定长的字符串在存储时,需要同时存储一个长度值。

2、.NET中的数据类型有了很大变化,比如Integer是从16位变为32位,DateTime以整数形式保存而不再是以前的Double型

。。。

在此不一一列举,有兴趣的可以参看微软出的相关文档。下面是改写后的结构体:

或许你已经注意到了,在改写的结构体中使用了一些属性,必须使用这些属性,才能构造出与VB6一模一样的结构体(至少说保存到文件中时时一样的结构)。

.NET中将结构体保存至文件的方法有两种:

一种是为结构体添加<Serializable()>属性,然后使用System.Runtime.Serialization.Formatters.Binary.BinaryFormatter中的Serialize方法将其串行化为文件流,并可用Deserialize方法将其还原为结构体;

另一种方法便是本文要讨论的,即结构体与字节数组之间的转化,因为在VB6中保存结构体时是按字节存储的,要做到同样效果需要将结构体其转化为字节数组。

再回到改写后的结构体中,为了定义属性,首先需要导入命名空间

Imports System.Runtime.InteropServices

接下来的结构体属性必不可少:

<StructLayoutAttribute(LayoutKind.Sequential,Pack:=1)>

对于定长字符串,需要添加如下属性:
<MarshalAs(UnmanagedType.ByValTStr,SizeConst:=11)>

注意,这里,字符串只能保存10个字符

对于定长数组,同样需要添加属性:

<MarshalAs(UnmanagedType.ByValArray,SizeConst:=44)>

另外,在使用前,需要对定长数组的长度进行ReDim,且长度必须与SizeConst相等。事实上,如果你定义了更长的长度,它会只截取SizeConst长度进行保存

接下来便是结构体与字节数组之间的转化,以及从文件读取结构体的源代码(注:部分源码根据网络上的C#版本改写)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读