我试图自动克隆一个对象,而不必实例化一个新对象并手动复制每个变量。
我记得那天(当我每天都在做 VB6 时)我想出了一种使用 PropertyBag 克隆对象的方法,这非常酷。但是我丢失了代码,不记得该怎么做了。
有没有人记得或有其他方法?
我试图自动克隆一个对象,而不必实例化一个新对象并手动复制每个变量。
我记得那天(当我每天都在做 VB6 时)我想出了一种使用 PropertyBag 克隆对象的方法,这非常酷。但是我丢失了代码,不记得该怎么做了。
有没有人记得或有其他方法?
我过去使用的方法是将所有实例变量放在 UDT 上。只要您使 UDT 保持最新,您就可以使用单个方法/语句复制类的数据。
给定一个“Person”类,这是一个简单的例子:
Private Type tPerson
ID As Long
FirstName As String
LastName As String
End Type
Private m_Person As tPerson
Public Sub InitPerson(ID As Long, FirstName As String, LastName As String)
m_Person.ID = ID
m_Person.FirstName = FirstName
m_Person.LastName = LastName
End Sub
Friend Sub SetData(PersonData As tPerson)
m_Person = PersonData
End Sub
Public Function GetClone() As Person
Dim p As New Person
p.SetData m_Person
Set GetClone = p
End Function
Public Property Get FirstName() As String
FirstName = m_Person.FirstName
End Property
要尝试代码:
Dim p As New Person
p.InitPerson 1, "MyName", "MyLastName"
Dim p2 As Person
Set p2 = p.GetClone
MsgBox p2.FirstName
如果您在 UDT 中维护所有实例变量,而不是单独声明它们,那么您可以拥有需要很少维护的简单 Clone 方法。
另一个优点是您可以将 UDT 放入文件句柄,以便快速序列化到磁盘。
Public Sub Save(filePathName As String)
Dim f As Integer
f = FreeFile()
Open filePathName For Binary Access Write Lock Read Write As #f
Put #f, , m_Person
Close #f
End Sub
一个可怜的男人的序列化解决方案真的:-)
这是你要找的吗?文章复制如下,以供后人参考。
您可以通过将数据放入 PropertyBag 对象,然后读取 PropertyBags Contents 属性来快速序列化您的数据。此属性实际上是一个字节数组,它是您的 PropertyBag 对象中数据的串行表示。您可以将此字节数组用于多种用途,包括通过 DCOM 进行数据传输的有效方法:
Private Function PackData() As String
Dim pbTemp As PropertyBag
'Create a new PropertyBag object
Set pbTemp = New PropertyBag
With pbTemp
'Add your data to the PB giving each item a
'unique string key
Call .WriteProperty("FirstName", "John")
Call .WriteProperty("MiddleInitial", "J")
Call .WriteProperty("LastName", "Doe")
'Place the serialized data into a string
'variable.
Let PackData = .Contents
End With
Set pbTemp = Nothing
End Function
要检索序列化数据,只需创建一个新的 PropertyBag 对象并将序列化字符串设置为其 Contents 属性。在将字符串分配给 Contents 属性之前将其转换为字节数组:
Private Sub UnPackData(sData As String)
Dim pbTemp As PropertyBag
Dim arData() As Byte
'Convert the string representation of the data to
'a Byte array
Let arData() = sData
'Create a new PropertyBag object
Set pbTemp = New PropertyBag
With pbTemp
'Load the PropertyBag with data
Let .Contents = arData()
'Retrieve your data using the unique key
Let m_sFirstName = .ReadProperty("FirstName")
Let m_sMiddleInitial = _
.ReadProperty("MiddleInitial")
Let m_sLastName = .ReadProperty("LastName")
End With
Set pbTemp = Nothing
End Sub
迈克·库尔茨 (Mike Kurtz),宾夕法尼亚州麦基斯洛克斯 (McKees Rocks)。
另请阅读:持久化组件的数据。
我的应用程序框架中的每个对象都有一个读取和存储方法。我所做的是向他们传递一个写入字节数组并存储字节数组的流。虽然这并不能消除必须处理每个属性的问题,但您只需处理一次读取和写入一次。
另一种方法是使用 Darrel Miller 所说的财产包,但您仍然必须分别处理每个财产。如果您已经阅读并存储,那么我的建议应该可以节省一些时间。