C#序列化实现深拷贝及原理

简介: 一、基本概念 1、深拷贝 深拷贝要求将要clone的对象的引用类型成员对象也拷贝到新对象中,而不是拷贝这些对象的引用(浅拷贝)。 2、序列化 将对象或对象图形转换成线性字节序列,以存储或传输到另一个位置的过程。

一、基本概念

1、深拷贝

深拷贝要求将要clone的对象的引用类型成员对象也拷贝到新对象中,而不是拷贝这些对象的引用(浅拷贝)。

2、序列化

将对象或对象图形转换成线性字节序列,以存储或传输到另一个位置的过程。

3、反序列化

接受存储的信息并利用它重新创建对象的过程。

二、案例实现

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;
  6. using System.IO;
  7. using System.Runtime.Serialization.Formatters.Binary;
  8. using System.Runtime.Serialization;
  9. namespace DeepCopy
  10. {
  11.     static class Program
  12.     {
  13.         [Serializable]
  14.         public class CPerson : ICloneable
  15.         {
  16.             public int Age { get; set; }
  17.             public string Address { get; set; }
  18.             public Name Name { get; set; }

  19.             public object Clone()
  20.             {
  21.                 using (MemoryStream ms = new MemoryStream(1000))
  22.                 {
  23.                     object cloneO;
  24.                     BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
  25.                     /* 序列化 */
  26.                     bf.Serialize(ms, this);
  27.                     ms.Seek(0, SeekOrigin.Begin);
  28.          
  29.                     /* 反序列化 */
  30.                     cloneO = bf.Deserialize(ms);
  31.                     ms.Close();
  32.                     return cloneO;
  33.                 }
  34.             }
  35.         }

  36.         [Serializable]
  37.         public class Name
  38.         {
  39.             public string FirstName { get; set; }
  40.             public string LastName { get; set; }
  41.             
  42.             public Name(string firstName, string lastName)
  43.             {
  44.                 FirstName = firstName;
  45.                 LastName = lastName;
  46.             }
  47.         }

  48.         static void Main(string[] args)
  49.         {
  50.             CPerson cp1 = new CPerson();
  51.             cp1.Age = 1;
  52.             cp1.Address = "Road 1";
  53.             cp1.Name = new Name("Lebron1", "James1");
  54.             
  55.             CPerson cp2 = (CPerson)cp1.Clone();
  56.             Console.WriteLine("cp1.Age={0},cp1.Address={1},cp1.Name={2} {3}", cp1.Age, cp1.Address, cp1.Name.FirstName, cp1.Name.LastName);
  57.             Console.WriteLine("cp2.Age={0},cp2.Address={1},cp2.Name={2} {3}", cp2.Age, cp2.Address, cp2.Name.FirstName, cp2.Name.LastName);
  58.             Console.WriteLine("-------------------------------------------------");
  59.             cp2.Name = new Name("Kobe1", "Brynt");
  60.             Console.WriteLine("cp2.Age={0},cp2.Address={1},cp2.Name={2} {3}", cp2.Age, cp2.Address, cp2.Name.FirstName, cp2.Name.LastName);

  61.             Console.ReadKey();
  62.         }
  63.     }
  64. }


 image

三、注意事项

通过序列化和反序列化实现深拷贝,其和其字段类型必须标记为可序列化类型,

既添加特性

(Attribute)[Serializable]

 

参考博客:

http://wenku.baidu.com/view/57a4e33731126edb6f1a10b4.html

http://www.csharpwin.com/csharpspace/12691r7400.shtml

相关文章
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
|
网络协议 API C#
C# 中模拟 POST 和 GET 请求的原理与实践
【1月更文挑战第4天】在现代网络应用中,HTTP请求是客户端与服务器交互的基础。其中,GET和POST是最常用的两种请求方法。本文将介绍如何使用C#语言模拟这两种请求,并解释其背后的工作原理。我们将利用.NET框架中的HttpClient类来发送请求,并处理服务器的响应。通过本文,读者将能够理解HTTP请求的基本构成,学会在C#中编写代码来模拟这些请求,进而在开发过程中实现与Web服务的交互。
|
11月前
|
存储 C# 数据库
解决C#对Firebase数据序列化失败的难题
在游戏开发中,Unity结合Firebase实时数据库为开发者提供强大支持,但在C#中进行数据序列化和反序列化时常遇难题。文章剖析了数据丢失或反序列化失败的原因,并给出解决方案,包括使用`JsonUtility`、确保字段标记为`[Serializable]`以及正确配置网络请求。示例代码演示了如何在Unity环境中实现Firebase数据的序列化和反序列化,并通过设置代理IP、Cookies和User-Agent来增强网络请求的安全性。这些技巧有助于确保数据完整传输,提升开发效率。
136 2
解决C#对Firebase数据序列化失败的难题
|
11月前
|
Java
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
105 2
|
11月前
|
自然语言处理 JavaScript 前端开发
JDK序列化原理问题之FuryJDK序列化性能问题的如何解决
JDK序列化原理问题之FuryJDK序列化性能问题的如何解决
154 2
|
11月前
|
缓存 Java
JDK序列化原理问题之Fury如何实现与JDK序列化100%兼容的如何解决
JDK序列化原理问题之Fury如何实现与JDK序列化100%兼容的如何解决
185 0
|
11月前
|
Java
JDK序列化原理问题之在JDK序列化中不同JDK版本字段不一致的情况如何解决
JDK序列化原理问题之在JDK序列化中不同JDK版本字段不一致的情况如何解决
156 0
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
168923 12
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
400 0
|
存储 C#
C#中的序列化和反序列化案例
C#中的序列化和反序列化案例

热门文章

最新文章