VB.NET中对象的克隆 (转)

VB.NET中对象的克隆 (转)[@more@]

vb.NET对象的克隆XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

侯永锋

  在3DMAX里面,做好一个物体(父物体)以后,可以选择Edit菜单中的Clone,下面有三中选项:Copy(生成一个同模样的子物体,两者的操作互不影响),Instance(父子互动,父物体的操作同样影响子物体,子物体也一样),还有一个Reference(暂不考虑)。

  在VB.NET,同样会碰到这样的问题。创建一个复杂对象(可能有很多种不同的数据类型)的实例,进行了一系列操作之后,想让一个中间变量或几个(另外的实例)保存它的状态,我们一般采取逐个变量赋值,有时候会写很长的代码:)这实际上就是上述的Copy问题。而对于Instance,很简单,新建一个实例,指向一下就可以了:

  Dim objA  As New CResume  ‘Cresume是一个自定义的记录简历信息的类

然后进行初始化,比如:

  objA.Name=”AAA”

  objA.Address=”Shanghai,China”

  ……

  Dim objB  As New CResume  ‘新建一个实例

  objB=objA

这样的话,objB跟objA有相同状态,值得注意的是objB改变一个Name,比如:

  objB.Name=”BBB”

而实际上,objA的Name也变为“BBB”,理由很简单。它们指向同一块内存空间。

下面我们重点讨论对象的Clone问题,即Copy以后的各个对象互不影响,关键是如何采用简单的方法解决我们的问题,MemoryStreamBinFormatter配合一下可以很简单的把对象克隆。

MemoryStream我以前提到过,是支持存储区为内存的流。

BinFormatter主要以二进制形式序列化和反序列化对象。

主要思路:

先用BinFormatterSerialize方法,把对象存储在MemoryStream流中,(操作跟其他Stream一样),然后Deserialize反序列化,得到一个流式的数据,转化为原来对象的类型就可以了。是不是很简单?呵呵。看一下代码再说:

CResume类的代码:

Imports System.IO

Imports System.Runtime.Serialization.Formatters

Public Class CResume 

‘注意类前面加上Serializable()属性,否则不可以序列化

  Dim m_Name As String  '姓名

  Dim m_Address As String   '地址

  Public Property Address() As String

  Get

  Return m_Address

  End Get

  Set(ByVal NewAddress As String)

  m_Address = NewAddress

   End Set

  End Property

  Public Property Name() As String

  Get

  Return m_Name

  End Get

  Set(ByVal NewName As String)

  m_Name = NewName

  End Set

  End Property

  Public Function Clone() As CResume

  Dim BF As New Binary.BinaryFormatter()

  Dim MS As New MemoryStream()

  BF.Serialize(MS, Me)

  MS.Position = 0

  Return (CType(BF.Deserialize(MS), CResume))

  End Function

End Class

在Form里面可以这样调用

  Dim Resume1 As New CResume()

 Dim Resume2 As New CResume()

  Resume1.Name = "AAA"

  Resume1.Address = "Shanghai,China"

  Resume2 = Resume1.Clone()

  Resume1.Name = "BBB"

  Resume1.Address = "Beijing,China"

  Debug.WriteLine(Resume1.Name)  ‘依然是AAA

  Debug.WriteLine(Resume1.Address) 

总结:主要调用了VB.NET的流和序列化技术,使得对象的克隆免去了繁琐的读写操作,也简化了代码。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-991712/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-991712/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值