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

        /// <summary>
/// 序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
public static void Serialize<T>(T obj)
{
try
{
using (FileStream fs = new FileStream("Serialize.bin", FileMode.OpenOrCreate))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, obj);//序列化
}
}
catch (Exception ex)
{ throw;
}
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T Deserialize<T>()
{
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>(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(, 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 =  };
CopyTest ct01 = (CopyTest)ct.Clone();

C#序列化与反序列化以及深拷贝浅拷贝的更多相关文章

  1. Java 深拷贝浅拷贝 与 序列化

    一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会 ...

  2. 【Java基础】序列化与反序列化深入分析

    一.前言 复习Java基础知识点的序列化与反序列化过程,整理了如下学习笔记. 二.为什么需要序列化与反序列化 程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终 ...

  3. [转载]php中深拷贝浅拷贝

    转自:http://cnn237111.blog.51cto.com/2359144/1283163 PHP中提供了一种对象复制的操作,clone.语法颇为简单: $a = clone $b; 1.浅 ...

  4. 使用Newtonsoft序列化对象,实现深拷贝

    工作记录 深拷贝:全新创建一个对象,值与复制对象一致,两个对象互不相关,修改一个对象不会影响到另一个对象 浅拷贝:全新创建一个对象,值与复制对象一致,两个对象相关,修改一个对象影响到另一个对象 在工作 ...

  5. Objective-C NSData与实现NSCoding协议进行序列化和反序列化

    1.NSData NSData是Objective-C语言中数据的基本类型,其成分可以理解为字节指针和长度的封装的类,来看看源代码 @interface NSData : NSObject <N ...

  6. Java 序列化 对象序列化和反序列化

    Java 序列化 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制 ...

  7. java序列化和反序列化使用总结

    一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输 ...

  8. java 序列化和反序列化的底层实现原理

    出处:序列化和反序列化的底层实现原理是什么? 一.基本概念1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过 ...

  9. 面试题:Java序列化与反序列化

    目录 序列化和反序列化的概念 应用场景? 序列化实现的方式 继承Serializable接口,普通序列化 继承Externalizable接口,强制自定义序列化 serialVersionUID的作用 ...

随机推荐

  1. npm run build出问题十分通用的解决方法

    1.C:\NanoFabric\52ABP\SPAHost\ClientApp\node_modules 原来的目录重命名为C:\NanoFabric\52ABP\SPAHost\ClientApp\ ...

  2. file-downloader相关问题

    2017-05-24 file-downloader框架中,如果你想用FileDownloader中的createAndStart(String url, String saveDir, String ...

  3. centos 6.5 搭建zookeeper集群

    为什么使用Zookeeper? 大部分分布式应用需要一个主控.协调器或控制器来管理物理分布的子进程(如资源.任务分配等)目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制协调程序的反复编写浪费 ...

  4. Java类加载机制及自定义加载器

    转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...

  5. JavaScript函数和内置对象

    一.函数 function f1(){ console.log("666"); } f1(); //调用函数 1.普通函数定义 function f1(a,b){ console. ...

  6. oracle创建表空间、添加数据库文件

    创建表空间: create [undo|TEMPORARY]tablespace venn datafile '/opt/oracle/db01/app/oracle/oradata/OSSORCL/ ...

  7. 百度图片http://img[0-9]\.imgtn.*?g此形式的链接图片下载方式

    """给出图片链接列表, 下载图片""" print(pic_urls) for pic_url in pic_urls: try: hos ...

  8. boost--BOOST_AUTO、typeof、result_of

    1.BOOST_AUTO BOOST_AUTO的功能类似于auto和any,可以用来定义任意类型数据,且可以在编译时自动推导出表达式的类型.BOOST_AUTO属于boost中的typeof库,使用需 ...

  9. openstack查看命令的restful调用形式

    [root@cc10 fast-pulsar2]# [root@cc10 fast-pulsar2]# cinder --debug type-create hzb DEBUG:keystonecli ...

  10. vs2015转到定义没反应

    开始菜单 -->所有程序-->Visual Studio 文件夹 --> Visual Studio Tools -->VS2015开发人员命令提示输入DOS命令: CD Co ...