以二进制形式保存对象到硬盘?望高手来解决!!!

painache 2004-11-22 05:10:00
讨论主题:
1、将对象变量保存至二进制数组
2、将二进制数组存储到数据库中
3、从数据库中读出此二进制数据并还原成对象变量

问题:
1、如何将一个对象变量保存到二进制数组中?
2、从数据库中读出一个以二进制保存的对象变量如何还原?
3、还原后的对象变量是否可以继续正常使用?

举例:
现有两个窗体form1、form2,一个类clsPeople、一个ACCESS数据库。


在form1内声明了一个对象变量cPeople为class1的一个实例

设置cPeople的属性 .Name="Tom" .Age="22"
form1内的部分代码:


Private cPeople As clsPeople

Set cPeople = New clsPeople
With cPeople
.Name = "Tom"
.Age = "22"
End With

Dim bytPeople() As Byte

........ '如何将设置好属性的对象变量保存进bytPeople()数组?

........ '如何将bytPeople()保存进Access数据库的Company表的People字段(字段类型为OLE对象)?



在form2内读出数据库中Company表的People字段,并还原成对象变量,然后使用这个对象变量。

form2内部分代码:

Private cPeople As clsPeople

....... '如何从数据库中读出二进制数据并还原成对象变量cPeople?

cPeople = ........

'使用这个对象变量

debug.Pring cPeople.Name
debug.Pring cPeople.Age


在下实在不材,昨天想了好久都解决不了这个问题,用GOOGLE搜了一下午也没搜到,查了CSDN的帖子也没有发现相关讨论,只好在这里求助各位高级别的VBer,请各位高手们不要吝啬您的才华,在下这里就虚心请教了!!!

http://community.csdn.net/Expert/topic/3576/3576540.xml?temp=.6850397

从这个连接转过来的.请高手来解决!跪谢!
...全文
266 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongle2001 2005-01-10
  • 打赏
  • 举报
回复
学习
HenryXiaoY 2005-01-10
  • 打赏
  • 举报
回复
ding
Willie_moc 2004-12-08
  • 打赏
  • 举报
回复
com有这方面专门的解决方法“永久对象”,即实现IPersistXXX接口的对象。在VB中的确没有在C++中那什好处理。但象你举的例子,根本不需要实现永久接口;也没必要非要用二进制保存,你form1应该不是简单的表结构就能表达,要不然你不用花那么多心思。我看过“用友”的ERP软件是用这样一种方法保存、更改和重新打开各种单据界面:它把各种单据的窗口统一分成两部分,一是单项控件集(TEXT控件数组)和一个集合(类似于DataGrid).在楼主属性保存方面,它的做法是用一个ADODB分级recordset或类似的中间组件实现的。第一级{SELECT 单据ID,单据名... from 单据清单},第二级{SELECT 单据ID,单据主表ID,控件的显示属性1~N项(如位置、是否显示等),邦定的表名,邦定字段},第三级{。。。。。。}。用这种方法实现楼主的例子,FROM1中更改了属性,实际上只是更改表中的数据。当FROM2打开时只要一个参数——单据名。如真是想用二进制保存,还是建议楼主实现IPersistXXX接口,但VB里只有属性页实现了IPersistPropertyBag,要保存到数据库还有点难度。
lndlwwh830 2004-11-30
  • 打赏
  • 举报
回复
up
胖河马 2004-11-29
  • 打赏
  • 举报
回复
...dll文件中又不含有运行时数据
lxcc 2004-11-29
  • 打赏
  • 举报
回复
可不可以把class1做成进程外组件?

假如可以的话,把组件的dll当做二进制文件,然后用ADO.Stream存到数据库
胖河马 2004-11-29
  • 打赏
  • 举报
回复
自定义类型或者数组可以先转换成xml再保存啊,哪有那么多现成的
painache 2004-11-28
  • 打赏
  • 举报
回复
我试过了.

如果属性为自定义类型或者数组将不能存取.
pigpag 2004-11-26
  • 打赏
  • 举报
回复
只能像上面的代码那样提取所有属性,并不是完全的对象串行化。不过结果一般是等价的,因为对象的属性一致了,行为一般也就一样的。
flying_sunny 2004-11-25
  • 打赏
  • 举报
回复
关注
aohan 2004-11-24
  • 打赏
  • 举报
回复
up
胖河马 2004-11-23
  • 打赏
  • 举报
回复
vb中只有公共类可以序列化

'Class cc
Option Explicit

Public Function save() As Byte()
Dim PropBag As PropertyBag
Set PropBag = New PropertyBag

Call PropBag.WriteProperty("a", "aaa")
Call PropBag.WriteProperty("b", "bbb")

save = PropBag.Contents
Set PropBag = Nothing
End Function

Public Function load(ByRef c() As Byte)
Dim PropBag As PropertyBag
Set PropBag = New PropertyBag

PropBag.Contents = c

MsgBox PropBag.ReadProperty("a")
MsgBox PropBag.ReadProperty("b")

Set PropBag = Nothing
End Function




'调用程序
Dim content() As Byte
Dim a As cc
Dim b As cc

Set a = New cc
content = a.save
Set a = Nothing

Set b = New cc
b.load content
Set b = Nothing
painache 2004-11-23
  • 打赏
  • 举报
回复
感谢bdhh(Silent)所给的方法.去试试
creazyfish 2004-11-23
  • 打赏
  • 举报
回复
顶!!!
xMars 2004-11-22
  • 打赏
  • 举报
回复
序列化就可以实现,具体就是用C++写一个COM组件,该组件的关键类继承自
某个可以实现序列化的抽象类

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧