VB6.0的COM对象序列化和反序列化

gooore 2010-07-24 10:24:26
请问VB6.0的COM对象能不能支持序列化。

能否分享一些代码。非常感谢
...全文
410 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gooore 2010-07-30
  • 打赏
  • 举报
回复
非常感谢
PctGL 2010-07-27
  • 打赏
  • 举报
回复
PropertyBag 这个东西就是ms实现的一个便捷的流存储类,就是这个东西 IPersistable

如果不需要外部独立存储,自己在类里面写个函数就能实现所谓的序列化

比如你要存储一个属性值,

public a as long

自己写个存储方法:

private sub SaveClassStream(localFile as string)
open localfile for binary as #1
put #1,,a
close #1
end sub

数据不仅仅可以以2进制写在磁盘,以任何形式写到任何可写的位置都可以,比如注册表
甚至临时储存区的内存里面,从而实现对象的共享,更甚者实现实例继承

private sub LoadClassStream(localFile as string)
open localfile for binary as #1
Gut #1,,a
close #1
end sub


需要储存class数据时,
1是自己添加需要存储的数据,2是自己主动调用 SaveClassStream 或 LoadClassStream

还是那句话完全自动化的COM的序列化,PropertyBag 实现不了
lz如果只是需要一个保存自定义类成员的东西,那么 Load/saveClassStream 完全够了
如果真是详细讨论vb的com类的序列化和反序列化实现。。。 总之,lz自己体会吧


Tiger_Zhao 2010-07-27
  • 打赏
  • 举报
回复
二进制方式是VB直接支持的,其他方式就需要自己实现了。

1)编写一个类 XMLPropertyBag,它的 ReadProperty 和 WriteProperty 要能存取普通的 VB 非对象类型、已经实现了 IPersistable 接口的对象。
2)定义一个 IPersistable 之类的接口,也有 ReadProperties 和 WriteProperties 方法,参数就是 XMLPropertyBag。
3)IPersistable 接口还需要有一个 ProgID 属性,用来返回 <工程名>.<类名>
 你用二进制编辑器打开我 2 楼示例中生成的 Object.dat,就会发现在 Unicode 字符串 "Object" 后面跟了一个 16 字节的 GUID,这是为了在反序列化时创建对象用的。
 而 VB 的设计就是不想开发人员关心 GUID 之类的事情,而且用 GUID 创建对象又要用到 API。作为自制的组件,通常会避免多个版本共存的情况,所以用 ProgID 就能唯一确定类,而且 ProgID 也可以直接用 CreateObject() 创建对象。

4)要有序列化功能的类实现 IPersistable 就可以了,当然它也必须是公共类。
Tiger_Zhao 2010-07-26
  • 打赏
  • 举报
回复
VB 支持二进制的序列化方式
'Class1
'必须放在 ActiveX Dll 或 ActiveX Exe 工程中,并且设置类的属性
' Instancing = 5 - MultiUse
' Persistable = 1 - Persistable
Option Explicit

Private m_Name As String

Public Property Get Name() As String
Name = m_Name
End Property

Public Property Let Name(ByVal RHS As String)
m_Name = RHS
End Property

Private Sub Class_ReadProperties(PropBag As PropertyBag)
m_Name = PropBag.ReadProperty("Name", vbNullString)
End Sub

Private Sub Class_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Name", m_Name, vbNullString
End Sub

'测试代码,要引用 Class1 所在工程或二进制 dll/exe
Option Explicit

Sub Main()
Serialize
Deserialize
End Sub

Sub Serialize()
Dim c As Class1
Dim PropBag As PropertyBag
Dim aContents() As Byte
Dim hFile As Integer

Set c = New Class1
c.Name = "ABC"

Set PropBag = New PropertyBag
PropBag.WriteProperty "Object", c
aContents = PropBag.Contents

hFile = FreeFile()
Open App.Path & "\Object.dat" For Binary Access Write As #hFile
Put #hFile, , aContents
Close #hFile
End Sub

Sub Deserialize()
Dim c As Class1
Dim PropBag As PropertyBag
Dim aContents() As Byte
Dim hFile As Integer

hFile = FreeFile()
Open App.Path & "\Object.dat" For Binary Access Read As #hFile
ReDim aContents(LOF(hFile) - 1)
Get #hFile, , aContents
Close #hFile

Set PropBag = New PropertyBag
PropBag.Contents = aContents

Set c = PropBag.ReadProperty("Object", Nothing)

Debug.Print c.Name
End Sub
gooore 2010-07-26
  • 打赏
  • 举报
回复
帖子加到100分了,谢谢。

楼上能不能进一步解释一下。我不理解你的意思。

VB6.0是不是只支持采用这种方式的二进制序列化?
PctGL 2010-07-26
  • 打赏
  • 举报
回复
一开始我就没想说 PropertyBag 这个东西,虽然这是一种解决方法,但他离真正意义上的序列化还差得远
在内部实现一个存储方法的方式,如果也算是序列化的话。。。 那序列化的意义就太小了
嗷嗷叫的老马 2010-07-26
  • 打赏
  • 举报
回复
学习一下.
bcrun 2010-07-26
  • 打赏
  • 举报
回复
“如果对象有对象属性”的话,那就把那个对象属性搞出个Contents这样的属性,通过PropBag返回一个字节数组:)
gooore 2010-07-26
  • 打赏
  • 举报
回复
采用xml序列化可以直接用文本打开读取信息。

有个问题是,如果对象有对象属性,二进制序列化是不是也保存对象属性的状态,假如这个对象不是可序列化的怎么办?
gooore 2010-07-26
  • 打赏
  • 举报
回复
谢谢楼上大牛。

是不是只支持二进制序列化,不支持xml和soap序列化?

搞定给分。非常感谢
PctGL 2010-07-25
  • 打赏
  • 举报
回复
可以实现部分,全部的还是不可能的,还原全部运行时状态对于com来说,没这功能
对于完全自动化存储全部的接口属性是可以的

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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