您现在的位置: 捷凌网安 >> 编程语言 >> VBNET >> 正文
VB.NET中对象的克隆

作者:佚名 责任编辑:左决 点击数: 更新时间:2008-4-11 5:25:14

  在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以后的各个对象互不影响,关键是如何采用简单的方法解决我们的问题,MemoryStream和BinFormatter配合一下可以很简单的把对象克隆。

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

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

  主要思路:

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

  CResume类的代码:

  Imports System.IO

  Imports System.Runtime.Serialization.Formatters

  <Serializable()> 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 = "office:smarttags" />Shanghai,China"

    Resume2 = Resume1.Clone()

    Resume1.Name = "BBB"

    Resume1.Address = "Beijing,China"

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

    Debug.WrITeLine(Resume1.Address)    

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

  • 上一篇文章:

  • 下一篇文章:
  •  
    最进更新
    普通文章VC++设计超强仿QQ自动伸缩窗04-17
    推荐文章基于HOOK和MMF的Win密码渗透04-17
    推荐文章几种VC++数据库开发技术的相04-17
    普通文章多线程、Socket技术及委托技04-11
    推荐文章VB.Net连接各种数据库的几种04-11
    普通文章VB.NET中的多窗体编程:升级04-11
    普通文章用VB.NET定制Windows控件04-11
    普通文章VB.NET中监视文件夹的变化04-11
    普通文章VB.NET中对象的克隆04-11
    推荐文章VB.NET中的TextBox控件详解04-11
     
    推荐文章
    推荐文章基于HOOK和MMF的Win密码渗透04-17
    推荐文章几种VC++数据库开发技术的相04-17
    推荐文章VB.Net连接各种数据库的几种04-11
    推荐文章VB.NET中的TextBox控件详解04-11
    推荐文章在VB.NET中进行抓屏04-11
    推荐文章VB.Net开发的长内容自动分页04-11
    推荐文章VB.NET中快速访问注册表技巧04-11
    推荐文章PHP5手动最简安装方法03-07
    推荐文章完全讲解PHP+MySQL的分页显示03-07
    推荐文章Linux Shell元字符知识笔记02-21
     
    热点文章 
    普通文章VC++设计超强仿QQ自动伸缩窗04-17
    推荐文章基于HOOK和MMF的Win密码渗透04-17
    推荐文章几种VC++数据库开发技术的相04-17
    普通文章VB.NET中的多窗体编程:升级04-11
    普通文章用VB.NET定制Windows控件04-11
    普通文章VB.NET中对象的克隆04-11
    推荐文章VB.NET中的TextBox控件详解04-11
    普通文章VB/VB.NET/C#导出到Excel的方04-11
    普通文章如何通过VB.NET获取网卡地址04-11
    普通文章VB.NET中使用ListView控件的04-11

    | 设为首页 | 加入收藏 | 联系站长 | 广告服务 | 友情链接 | 版权申明 | 网站地图 |

    在线交流 捷凌网安主群:51649627
    Copyright 2007-2008 © 捷凌网安. All rights reserved.
    备案序号:蜀ICP备08001812号