用序列化实现List<T> 实例的深复制

Java对象深拷贝详解(List深拷贝) Java对象深拷贝详解(List深拷贝) 解决List复制到新的List时,新的List值错误问题 阅读详情

如果 List<T> 里的 T 是引用类型(如myClass类),则在 像这种写法:

  List<myClass> lists1 = new List<myClass>()

  {

        new myClass(),

        new myClass()

  };

  

   List<myClass> lists2 = new List<myClass>(lists1 );

 其实是一个浅复制的过程。

如果要实现深复制,通过有几种做法,可以用foreach, 或者重写Clone()方法。

但最好用和最方便的方法还是使用【序列化】的方式来实现。

序列化是指将对象转换为字节流的形式,然后保存在内存或者数据库中。序列化可以保存对象的状态信息,当需要使用的时候在反序列化回来。所以将对象序列化可以存储和交换数据。例如如果web 服务发送,或者在应用程序从这个域发送到另一个域。

若要序列化对象,您需要待序列化的对象、要包含序列化对象的流,以及一个Formatter。序列化包括:二进制序列化和 xml 序列化。


例如,使用 XmlSerializer ,将要拷贝的对象序列化到流中,然后通过反序列化得到新的对象。

    /// <summary>
    /// 序列化类
    /// </summary>
    public class SerializLog
    {
        //1.使用序列化的方式完成 引用对象的 深复制 是最好的方式
        //2.下面的 Clone方法,我需要使用 泛型对象 做为参数,则在 Clone后面需要带上<T>的声明,否则编译出错
        
        public static T Clone<T>(T realObject) // T 要序列化的对象
        {
            using (Stream stream = new MemoryStream()) // 初始化一个 流对象
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T)); //将要序列化的对象序列化到xml文档(Formatter)
                serializer.Serialize(stream, realObject); //将序列后的对象写入到流中
                stream.Seek(0, SeekOrigin.Begin);         
                return (T)serializer.Deserialize(stream);// 反序列化得到新的对象
            }
        }
    }


深入掌握 C#/.NET Core 中的深拷贝:五大实现方式详解 确保您的类实现了。 阅读详情

相关推荐

用序列化实现ListT 实例的深复制(推荐)

如果 List 里的 T 是引用类型(如myClass类),则在 像这种写法: List lists1 = new List() { new myClass(), new myClass() }; List lists2 = new List(lists1 ); 其实是一个浅复制的过程。 如果要实现深复制,通过有几种做法,可以用foreach, 或者重写Clone()方法。 但最好用和最方便的方法还是使用【序列化】的方式来实现。 序列化是指将对象转换为字节流的形式,然后保存在内存或者数据库中

List的复制(浅拷贝与深拷贝)

开门见山的说,List的复制其实是很常见的,List其本质就是数组,而其存储的形式是地址如图所示,将List 0列表复制时,其实相当于List0的内容复制给了List1,java中相同内容的数组指向同一地址,即进行浅拷贝后List0与List1指向同一地址。造成的后果就是,改变List1的同时也会改变List0,因为改变List1就是改变List1所指向地址的内容,由于List0也指向同一地址,所以List0与List1一起改变。

qq_42296835的博客 6488

R 分析裂区试验设计

裂区试验有主区部分和副区部分, 因而有主区部分误差(误差 a,简记为Ea )和副区部分误差(误差b,简记为Eb) 分别用于测验主区处理以及副区处理和主、副互作的显著性。对同一个二因素试验资料作自由度和平方和的分解,则可发现随机区组的误差项自由度和平方和分别为DFe、SSe,而裂区设计有两个误差项,其自由度和平方和分别为DFEa,DFEb, SSEa, SSEb。而区组,处理效应等各个变异项目的自由

samhuairen的专栏 8933

【Python】【List】深拷贝与浅拷贝

深浅拷贝

weixin_43084721的博客 1742

AD创建属于自己的元件库(详细)

我今天开始学习AD2022,但是我想自己创建属于自己的元件库,但是奈何找了好多教程就是随便几句话就把我打发走了,弄了一天都没搞定(也许是我比较菜),所以现在乱懂了,自己写一个属于我们自己小白的教程,希望有用吧哈哈我比较偷懒,直接使用嘉立创上画好的元件导入,和我们自己创建自己画的步骤其实都一样。

qq_33591173的博客 2万+

RoboMaster新手必看:用STM32 HAL库搞定大疆M3508电机正反转(附完整代码)

本文详细介绍了如何使用STM32 HAL库驱动大疆M3508电机实现正反转控制,包括硬件准备、PWM配置、电机校准及完整代码实现。特别针对RoboMaster新手常见问题提供了解决方案,如电机抖动、不转等故障排查,并分享了缓启动、DMA更新等进阶技巧,帮助开发者快速掌握电机控制核心技术。

weixin_42519985的博客 225

.NET -- 深拷贝和浅拷贝

基本概念: 浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和原对象仅仅是引用名称有所不同,但是它们共用一份实体。对任何一个对象的改变,都会影响到另外一个对象。大部分的引用类型,实现的都是浅拷贝,引用类型对象之间的赋值,就是复制一个对象引用地址的副本,而指向的对象实例仍然是同一个。 深拷贝:指对象的子段被拷贝,同时字段引用的对象也进行了拷贝。深拷贝创建的是整个源对象的结构,拷贝对象和原对象相互独立,不共享任何实例数据,修改一个对象不会影响到另一个对象。值类型之间的赋值操作,执行的就是深拷贝。

还在无限CURD的x1aobao 298

FineBI制作数据可视化大屏-数据连接(1)

快速上手大屏可视化,FineBI数据连接配置。

Pangaoyang_的博客 1909

C# 实现一个对象的深复制的方法

/// &lt;summary&gt; /// 使用序列化的方法实现深复制 /// &lt;/summary&gt; /// &lt;typeparam name="T"&gt;&lt;/typeparam&gt; /// &lt;param name="source"&gt;&lt;/param&gt; /// &lt;param name="desti

lishuangquan1987的博客 9972

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1669

YOLOv11低照度增强主干网络PE-YOLO:原理与完整实现教程

编码器部分# 解码器部分self.dec_conv2 = nn.Conv2d(512, 128, 3, padding=1) # 跳跃连接self.dec_conv3 = nn.Conv2d(256, 64, 3, padding=1) # 跳跃连接self.dec_conv4 = nn.Conv2d(128, 32, 3, padding=1) # 跳跃连接# 编码路径# 解码路径(带跳跃连接)

FJN110的博客 724

用序列化实现深复制

文章目录前言浅复制与深复制关于序列化序列化实现深复制其他深复制方法使用object.clone()实现 前言 浅复制与深复制 浅复制:被复制的对象的所有变量都含有原来对象的相同值,对象中对其他对象的引用,仍指向原对象。 深复制:将引用对象的变量指向新对象,而不是原对象。 理解:浅复制修改会对象后浅复制的对象造成同样的效果。例: Person p1 = new Person(); Person p2 = p1; 关于序列化 Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节

qq_45430163的博客 422

SpringBoot4.0+JDK25+GraalVM实战:云原生新纪元,微服务性能翻倍的落地指南

三者的组合不是偶然,而是“框架优化+JDK升级+虚拟机革新”的必然结果——SpringBoot4.0完善了对GraalVM原生镜像的支持,JDK25强化了云原生与AOT编译能力,GraalVM则提供了极致的启动速度和资源利用率,三者协同,刚好命中云原生微服务的核心痛点。SpringBoot4.0+JDK25+GraalVM的组合,不是简单的版本升级,而是云原生微服务的一次性能革命。

2601_94871597的博客 1140

java实现深复制:clone()及序列化

JAVA实现深复制: clone()方法及序列化 Java语言取消了指针的概念,导致了许多程序员在编程中常常忽略了对象与引用的区别。Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,常常要应用clone()方法来复制对象。比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。以下是一个小例子: Java代码 1. public class A { 2. p

lidiansheng的专栏 9750

第三节:Vben Admin登录对接后端login接口

上一节,我们梳理的Vben Admin登录功能接口的逻辑,本节开始正式开启后端的开发后端我们采用Python的Flask项目,Flask-SQLAlchemy管理数据库模型,Flask-Migrate进行模型迁移。参考版本如下:Flask3.0.23.1.1本节,我们已经开启的后端的开发,因为是主要介绍Vben Admin的登录逻辑,所以Flask开发这里只截取了部分主要代码。

cuiwin的专栏 4187

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

使用Hutool实现深复制,非序列化

思路 递归复制 测试代码 import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Console; import cn.hutool.core.util.ReflectUtil; import java.lang.reflect.Constructor

qq_28807077的博客 8578

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java List中内容的深复制

探讨如何对Java List中内容的深复制,结论是把List中的对象进行clone(),或者序列化的方法可以达到目的,而把List本身(对象的容器)进行clone()是不行的。

我的博客 5967

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

序列化之用序列化实现深复制

首先,我们先来bala一下深复制和浅复制。浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的...

喜码拉雅 568

浅复制和深复制-以HashMap为例

1、简介 In this tutorial, we'll explore the concept of a shallow vs deep copy of a HashMap along with several techniques to copy a HashMap in Java. We'll also consider some of the external libraries that can help us in specific cases. 探索HashMap的浅复制(shallow

lzhfdxhxm的博客 5309

java中的深复制_java中深复制知识点详解

在正式开始深复制的讲解之前,我们先来理解一下概念。假设一个物品需要批量生产,但是这个物品还配有赠品,生产的时候需要把赠品也列在计划内。所谓深复制的原理就是这样,我们不能只复制属性,包括引用之类的附带也需要被复制。下面小编就为大家带来深复制的两种不同方法。1.序列化实现如下为谷歌Gson序列化HashMap,实现深度复制的例子:public class CopyDeepMapTest {public...

weixin_29231027的博客 344

浅复制与深复制区别以及使用场景和案例

浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 深复制(深克隆): 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象 所引用的对象都复制了一遍。 如何进行类复制? object类当中提供了浅复制的具体方法 注意事项 由doc我们可以得出以下几点主要事项

qq_42261668的博客 2023

List深复制

// 深复制 public <T> List<T> depCopy(List<T> srcList) { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); try { ObjectOutputStream out = new ObjectOutputStream(byte...

weixin_40763897的博客 1995

java深复制的两种实现方式

深复制的两种实现方式 1.重写clone方法 package com.entity; import lombok.Data; /** * @Author: zhaokj * @Date: 2021/11/14/10:23 * @Description: **/ @Data public class Team implements Cloneable { private String name; private String org; @Override public Ob

lfssst的博客 1185

java 深复制 浅复制_Java对象深复制与浅复制实例详解

Java对象深复制与浅复制实例详解我们在遇到一些业务场景的时候经常需要对对象进行复制,对于对象的复制一般有两种方式,深复制和浅复制浅复制:对象的复制仅是对象本身,对象引用的其它对方并不会复制。深复制:对象的复制包含对象引用的对象。Java所有对象的基类提供了clone方法,但是这个方法是protected native修饰,因此只暴露给之类去重写,外部是无法直接调用的。我们现在来测试两种复制,首选...

weixin_39683176的博客 150

对象的深复制与浅复制及深复制的两种实现方法<Reprinted>

深复制与浅复制: 浅复制(shallow clone): 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 深复制(deep clone): 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的...

a1751326的博客 166

c#对象深复制 序列化与反序列化

我们常会在C#开发中用到对象深复制(生成两个独立的对象,而非索引,修改其中一个的内容并不影响另一个)的情况。 foreach方法遍历速度实在感人,最高效的方法是用序列化和反序列化完成。 比如我深复制一个字典,生成一模一样的两个独立的字典类 Dictionary<string, classDataForChart> cdfc = new Dictionary&l...

angliaokantang0683的博客 263
上一篇: 一张表保存c盘下所有文件的路径
下一篇: 使用COALESCE+SUM+CASE
skyandcode
博客等级 码龄14年 53粉丝 65原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值