对象的深拷贝

2024-02-06

我可以请一些帮助来执行对象的深层复制吗?

这是我的代码:

Option Explicit On
Option Strict On

<Serializable> Public Class [Class]
Private _Name As String
Private _ListOfFields As New List(Of Field)

Public Property Name As String
    Get
        Return _Name
    End Get
    Set(value As String)
        _Name = value
    End Set
End Property

Public Property ListOfFields As List(Of Field)
    Get
        Return _ListOfFields
    End Get
    Set(value As List(Of Field))
        _ListOfFields = value
    End Set
End Property

Public Function Clone() As [Class]
    Return DirectCast(Me.MemberwiseClone, [Class])
End Function

End Class

Field 也是我自己编写的一个类。

我需要修改 Clone() 函数以返回深层副本吗?


您可以通过调用此辅助函数来创建任何类的克隆:

Function DeepClone(Of T)(ByRef orig As T) As T

    ' Don't serialize a null object, simply return the default for that object
    If (Object.ReferenceEquals(orig, Nothing)) Then Return Nothing

    Dim formatter As New BinaryFormatter()
    Dim stream As New MemoryStream()

    formatter.Serialize(stream, orig)
    stream.Seek(0, SeekOrigin.Begin)

    Return CType(formatter.Deserialize(stream), T)

End Function

这是通过将类中的所有信息序列化为可移植对象,然后重写它以切断任何引用指针来实现的。

Note:传入的类及其作为属性公开的任何其他类必须被标记<Serializable()> https://msdn.microsoft.com/en-us/library/System.SerializableAttribute(v=vs.110).aspx为了使用BinaryFormatter.Serialize https://msdn.microsoft.com/en-us/library/System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(v=vs.110).aspx

如果您想让自己的类公开可克隆方法本身,您可以添加该方法并实现ICloneable https://msdn.microsoft.com/en-us/library/system.icloneable(v=vs.110).aspx界面如下:

<Serializable()>
Public Class MyClass : Implements ICloneable

    'NOTE - The Account class must also be Serializable
    Public Property PersonAccount as Account
    Public Property FirstName As String

    Function Clone(ByRef orig As MyClass) As MyClass Implements ICloneable.Clone

        ' Don't serialize a null object, simply return the default for that object
        If (Object.ReferenceEquals(orig, Nothing)) Then Return Nothing

        Dim formatter As New BinaryFormatter()
        Dim stream As New MemoryStream()

        formatter.Serialize(stream, orig)
        stream.Seek(0, SeekOrigin.Begin)

        Return CType(formatter.Deserialize(stream), T)

    End Function

End Class

Note:请注意 ICloneable 附带了它的份额争议 https://stackoverflow.com/q/699210/1366033因为它不会向调用者指示它是否正在执行深克隆或浅克隆。实际上,您不需要接口就能将方法添加到您的类中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象的深拷贝 的相关文章

  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • 如何创建未定义的循环计数

    我正在尝试创建一个程序 它将循环遍历所有字母 我想要例如显示aaaa then aaab to aaaz then aaba依此类推zzzz 问题是 如何让用户输入字母计数 这是我的代码 只有 3 个字母 Dim abc As String
  • 如何获取对象的所有属性?

    如何在 JavaScript 中使用反射获取对象的所有属性 循环遍历对象并获取属于该对象且不属于该对象的每个键 一个函数 var properties for var key in obj if obj hasOwnProperty key
  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • 如何从嵌套的对象数组中获取每个父级的值

    所以我有多个对象数组 每个对象都包含一个子对象 e g const data id 1 name parent 1 children id c1 name child 1 children id g1 name grand 1 childr
  • 从特定 IP 地址发送 SOAP 请求

    我有一个具有多个 IP 地址的系统 但我只能从一个 IP 地址发起 SOAP 请求 我如何在 VB NET 中获得它 我从来没有这样做过 看起来很复杂 首先 阅读自定义 ASMX 客户端代理的方法 http johnwsaunders3 w
  • 检查 DBNull 会引发 StrongTypingException

    我正在使用数据集从数据库中提取数据 一行中的一个字段是NULL 我知道这个 但是 以下 vb net 代码会抛出StrongTypingException 在数据集设计器中自动生成的 get SomeField 方法中 If Not IsD
  • 将多维数组转换为单数组(Javascript)

    我有一个对象数组 来自 XLSX js 解析器 因此其长度和内容各不相同 表示已给予项目的资助 简化后 它看起来像这样 var grants id p 1 location loc 1 type A funds 5000 id p 2 lo
  • C++中有没有办法让派生类重写基类静态方法?

    我有一个多次派生的基类 B D1 D2 等 在类 B 中 我希望有一个静态方法 getInfo 它返回一个 BaseInfo 类 基本上是一个包含类 B 的默认成员值的类 因此将其设为静态是有意义的 因为不需要特定的实例 现在 有没有办法强
  • 类函数/变量在使用之前是否必须声明?

    所以我在学习课程时偶然发现了一些对我来说相当尴尬的事情 class Nebla public int test printout return x void printout printout2 private int x y void p
  • 从字体到跨度(大小和颜色)和背面的正则表达式(VB.NET)

    我正在寻找一个正则表达式 可以将我的字体标签 仅具有大小和颜色属性 转换为具有相关内联CSS的span标签 如果有帮助的话 这将在 VB NET 中完成 我还需要一个正则表达式来实现相反的效果 下面详细说明的是我正在寻找的转换示例 font
  • 递归修剪对象中所有元素的更好方法?

    如果我有一个像这样的物体 const obj field subfield innerObj a asdasd asdas innerArr s ssad innerArrObj b adsad 我想出了这样的东西 const trimFi
  • Outlook 加载项,无法读取未定义的属性“BeginRequestEventArgs”

    我使用 Visual Studio 开发了 Outlook 插件 我的插件有一个按钮 用于填充会议邀请正文中的详细信息并添加所需的与会者 这在 99 的情况下都有效 但是 时不时地它会给我下面的 JavaScript 错误 Uncaught
  • 有没有更简单的方法来处理复选框?

    在 vb net 中 我有一个包含一组四个复选框的表单 每个复选框都表示 选中时 用户想要向其订单添加特殊指令 代码如下所示 If SpecialInstruction1CheckBox Checked Then AddSpecialIns
  • vs2012中的SQL CLR项目

    安装VS2012发行版后 我找不到SQL CLR项目模板 我怎样才能着手创建这种类型的项目 Thanks 现在 所有各种数据库对象都是在 SQL Server 数据库项目内创建的 他们消除了数据库项目 SQL 脚本 和 SQL CLR 项目
  • VB.NET 中的 TextChanged 事件

    我有两个基本文本框 比方说 A 和 B 我希望在一个文本框中输入内容以清除另一个文本框中的任何输入 例如 在 A 中键入 123 现在在 B 中键入 456 B 应包含 456 A 应为空 但是 我在 B 中收到 56 而 A 为空 似乎
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • 更改组合框下拉列表边框的颜色

    My code Private Sub ComboBox2 DrawItem sender As Object e As DrawItemEventArgs Handles ComboBox2 DrawItem If e Index lt
  • 需要将用户名和密码添加到 VB.NET Web 服务客户端中的 SOAP 标头

    我需要查询一个进行基本身份验证的 Web 服务 将用户名和密码放在请求标头中 我的客户端是用 VB NET Visual Basic Express Edition 2010 编写的 我已将 Web 服务添加到服务引用中 它为我自动生成了合
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练

随机推荐

  • Python 请求,警告:urllib3.connectionpool:连接池已满

    我正在 python 3 中使用 requests 库 尽管我尽了最大努力 但以下警告仍然无法消失 警告 requests packages urllib3 connectionpool 连接池已满 正在丢弃连接 myorganizatio
  • 允许电子邮件和用户名进行身份验证

    我正在使用 ASP Net Identity 2 1 创建两个项目 MVC 5 和 Web API 但我找不到如何使用电子邮件和用户名进行身份验证 名为 管理 的区域必须使用用户名 而公共区域必须使用电子邮件用于身份验证的地址 问题是只有一
  • 没有事务的 python-mysqldb

    我正在阅读有关 python 中事务如何工作的内容MySQLdb In 本教程 http zetcode com db mysqlpython 它说 在Python DB API中 我们不调用BEGIN语句来启动一个 交易 创建游标时会启动
  • CakePHP显示字段的使用

    你能告诉我如何使用 CakePHP 的 displayField 指令吗 我不知道如何使用它 因此 在模型文件中 我有以下代码
  • Python 无法捕获重写的 NameError

    你如何解释这一点 这段代码应该覆盖 NameError 然后捕获它 OldNameError NameError class NameError OldNameError pass try ccc except NameError as e
  • Pharo Smalltalk 的类似 Sinatra 的网络框架 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有Sinatra http www sinatrarb com 类似 Pharo 的网络框架 或者
  • C#-ToLower() 有时会删除字母“I”中的点

    在对某些字符串调用 ToLower 时 我们注意到一个奇怪的错误 输入字符串是 string s DocumentInfo string t s ToLower sometimes t documentinfo other times t
  • HBase区域服务器和Hadoop数据节点应该在同一台机器上吗?

    抱歉 我没有资源来设置集群来测试它 我只是想知道 我可以将 hbase 区域服务器部署在 hadoop 数据节点计算机之外的单独计算机上吗 我想答案是肯定的 但我不确定 hbase区域服务器和hadoop数据节点部署在不同的机器上是好是坏
  • 将 2 个 FRC 与一个 TableView 一起使用并配置 FRCDelegate

    我找到了这个帖子问题链接 https stackoverflow com questions 24556123 nsfetchedresultscontroller multiple frcs delegate error when upd
  • 用逗号分隔

    嘿 我有这个 following user id row following user id 我得到 44443344330 然后我使用 implode 函数并用逗号分隔 44 44 33 44 33 0 但我不想要最后一个数字的最后一个逗
  • 有没有办法将 SQL 查询中的 WHERE 和 HAVING 子句进行 OR 运算?

    假设我有一个 SQL 查询 SELECT Label1 Label2 SUM number as MySum FROM MyTable GROUP BY Label1 Label2 它给了我一些结果 比如 Label1 Label2 MyS
  • 如何在 FloatingActionButton 上显示图标?

    我在 FloatingActionButton 上显示图标时遇到问题 图标失去透明度 我有compileSdkVersion 28 依赖项是 dependencies implementation fileTree dir libs inc
  • 第一次查询速度慢

    当我对表执行第一个查询时遇到麻烦 即使我更改要查找的范围日期 后续查询也会快得多 我假设 PostgreSQL 实现了一种缓存机制 可以让后续查询更快 我可以尝试预热缓存 以便第一个用户请求可以命中缓存 但是 我认为我可以以某种方式改进以下
  • ViewPager OnLongClick 侦听器未触发

    我有一个包含 ViewPager 的片段 当我膨胀布局时 我为其分配一个 OnLongClick 侦听器 如下所示 mPager setOnLongClickListener mOnPagerLongClickListener 但是 当我长
  • zend gdata picasa php api 停止工作

    我已经使用 Zend Gdata 好几年了 然而 今天当我未更改的代码执行以下命令时 query this gt gp gt newAlbumQuery 我收到以下错误 exception Zend Gdata App HttpExcept
  • gstreamer:如何改变从文件中获取的一个流的渲染时间

    我有两个媒体文件 例如 file0 和 file1 我想将它们合并成一个具有 画中画 效果的单个 file0 中的内容要显示在整个窗口上 并且 file1 中的内容将显示在左上角 较小的盒子 还有一点是 file1 中的内容应该被渲染 从基
  • 反编译的 DLL - 有助于判断它是 C# 还是 VB.NET 的线索?

    当使用DotPeek之类的东西反编译DLL时 我如何判断它最初是用VB Net还是C 编码的 我认为没有简单的方法可以判断 但在某些反编译的代码中可能存在明显的迹象 即线索 您可以查找参考Microsoft VisualBasic图书馆 如
  • 高度大于屏幕高度的 Flutter 可滚动堆栈

    我有一个小部件层次结构 其中SingleChildScrollView是父母有Stack作为孩子 Stack有两个孩子 如果第二个孩子超出屏幕高度 其高度就会被剪裁 根据文档 堆栈占用的大小根据Non Positioned孩子 所以这意味着
  • 如何在 Visual Studio Express 中查看异常详细信息?

    How do you view exception details such as messages and stack traces in VS Express 2012 I am using Visual Studio Express
  • 对象的深拷贝

    我可以请一些帮助来执行对象的深层复制吗 这是我的代码 Option Explicit On Option Strict On