博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#序列化与反序列化以及深拷贝浅拷贝
阅读量:7117 次
发布时间:2019-06-28

本文共 2381 字,大约阅读时间需要 7 分钟。

基于二进制数据流的序列化和反序列化

///         /// 序列化        ///         /// 
/// public static void Serialize
(T obj) { try { using (FileStream fs = new FileStream("Serialize.bin", FileMode.OpenOrCreate)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, obj);//序列化 } } catch (Exception ex) { throw; } } ///
/// /// ///
///
public static T Deserialize
() { T res = default(T); try { using (FileStream fs=new FileStream("Serialize.bin",FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); res = (T)bf.Deserialize(fs); } } catch (Exception) { throw; } return res; }

此时需要序列化的对象必须要声明为可序列化,只需要在声明类的同时采用关键字Serializable,如下:

[Serializable]    public class Test     {        public string Name { get; set; }        public int Age { get; set; }    }

  以上便可以完成序列化的反序列化的操作。

基于二进制序列化的反序列化的拷贝,C#是基于面型对象的开发语言,自定义声明的类都是采用引用传递的形式,有时候数据的修改对于这种引用传递来说并不是我们想要的结果,因此我们需要该对象的一份拷贝。

以下是基于内存序列化的一种方式:

public static T Copy
(T obj) { if (obj == null) { return default(T); } T res = default(T); using (MemoryStream ms = new MemoryStream()) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, obj);//序列化 ms.Seek(0, SeekOrigin.Begin); res = (T)bf.Deserialize(ms);//反序列化 } return res; }

这样获取到的拷贝对象跟原来的对象就不是指向同一个地址,这样操作新的对象也不会影响原来的对象。

还有一种是实现ICloneable接口,在Clone方法中返回对象的一个浅拷贝MemberwiseClone。

public class CopyTest : ICloneable    {        public string Name { get; set; }        public int Age { get; set; }        public object Clone()        {            return this.MemberwiseClone();//获取副本        }    }

通过以下方式便可以获得对象的一个拷贝对象:

CopyTest ct = new CopyTest() { Name = "Test", Age = 99 };CopyTest ct01 = (CopyTest)ct.Clone();

 

转载于:https://www.cnblogs.com/hglSV/p/10223171.html

你可能感兴趣的文章
探讨.net Socket支持在线连接数量
查看>>
InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法...
查看>>
Toad 所有 菜单说明(太多)
查看>>
12306登录界面的代码流程
查看>>
POJ 1860 - Currency Exchange
查看>>
基于springmvc的简单增删改查实现---中间使用到了bean validation
查看>>
LeetCode总结 -- 树的性质篇
查看>>
聊聊分布式事务
查看>>
第一次使用crontab linux选择编辑器问题
查看>>
模仿mybatis,用jdk proxy实现接口
查看>>
HTML学习笔记之二(回到顶部 与 回究竟部)
查看>>
Node.js之HTTP请求与响应
查看>>
数据库查询语句研究
查看>>
为什么要原型设计
查看>>
java.lang.IllegalThreadStateException异常原因解析
查看>>
读CopyOnWriteArrayList有感
查看>>
程序员的成长阶梯和级别定义(转)
查看>>
HTTP Authorization
查看>>
Js判断出生年月填写的 是否正确
查看>>
hiho1093_spfa
查看>>