C#二进制流的序列化和反序列化
public class BinaryHelper
{
/// <summary>
/// 将对象序列化为byte[]
/// 使用IFormatter的Serialize序列化
/// </summary>
/// <param name="obj">需要序列化的对象</param>
/// <returns>序列化获取的二进制流</returns>
public static byte[] FormatterObjectBytes(object obj)
{
if(obj==null)
throw new ArgumentNullException("obj");
byte[] buff;
try
{
using (var ms = new MemoryStream())
{
IFormatter iFormatter = new BinaryFormatter();
iFormatter.Serialize(ms, obj);
buff = ms.GetBuffer();
}
}
catch (Exception er)
{
throw new Exception(er.Message);
}
return buff;
} /// <summary>
/// 将对象转为二进制文件,并保存到指定的文件中
/// </summary>
/// <param name="name">文件路径</param>
/// <param name="obj">待存的对象</param>
/// <returns></returns>
public static bool BinaryFileSave(string name,object obj)
{
Stream flstr=null;
BinaryWriter binaryWriter=null;
try
{
flstr = new FileStream(name, FileMode.Create);
binaryWriter = new BinaryWriter(flstr);
var buff = FormatterObjectBytes(obj);
binaryWriter.Write(buff);
}
catch (Exception er)
{
throw new Exception(er.Message);
}
finally
{
if (binaryWriter != null) binaryWriter.Close();
if (flstr != null) flstr.Close();
}
return true;
} /// <summary>
/// 将byte[]反序列化为对象
/// 使用IFormatter的Deserialize发序列化
/// </summary>
/// <param name="buff">传入的byte[]</param>
/// <returns></returns>
public static object FormatterByteObject(byte[] buff)
{
if(buff==null)
throw new ArgumentNullException("buff");
object obj;
try
{
using (var ms = new MemoryStream())
{
IFormatter iFormatter = new BinaryFormatter();
obj = iFormatter.Deserialize(ms);
}
}
catch (Exception er)
{
throw new Exception(er.Message);
}
return obj;
} /// <summary>
/// 将对象序列化为byte[]
/// 使用Marshal的StructureToPtr序列化
/// </summary>
/// <param name="obj">需序列化的对象</param>
/// <returns>序列化后的byte[]</returns>
public static byte[] MarshalObjectByte(object obj)
{
if(obj==null)
throw new ArgumentNullException("obj");
byte[] buff;
try
{
buff = new byte[Marshal.SizeOf(obj)];
var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buff, );
Marshal.StructureToPtr(obj, ptr, true);
}
catch (Exception er)
{
throw new Exception(er.Message);
}
return buff;
} /// <summary>
/// 将byte[]序列化为对象
/// </summary>
/// <param name="buff">被转换的二进制流</param>
/// <param name="type">转换成的类名</param>
/// <returns></returns>
public static object MarshalByteObject(byte[] buff, Type type)
{
if(buff==null)
throw new ArgumentNullException("buff");
if(type==null)
throw new ArgumentNullException("type");
try
{
var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buff, );
return Marshal.PtrToStructure(ptr, type);
}
catch (Exception er)
{
throw new Exception(er.Message);
}
} /// <summary>
/// 将文件转换为byte数组
/// </summary>
/// <param name="path">文件地址</param>
/// <returns>转换后的byte[]</returns>
public static byte[] FileObjectBytes(string path)
{
if(string.IsNullOrEmpty(path))
throw new ArgumentNullException("path");
if (!File.Exists(path)) return new byte[];
try
{
var fi = new FileInfo(path);
var buff = new byte[fi.Length];
var fs = fi.OpenRead();
fs.Read(buff, , Convert.ToInt32(fs.Length));
fs.Close();
return buff;
}
catch (Exception er)
{
throw new Exception(er.Message);
}
} /// <summary>
/// 将byte[]转换为文件并保存到指定的地址
/// </summary>
/// <param name="buff">需反序列化的byte[]</param>
/// <param name="savePath">文件保存的路径</param>
/// <returns>是否成功</returns>
public static string FileByteObject(byte[] buff, string savePath)
{
if(buff==null)
throw new ArgumentNullException("buff");
if(savePath==null)
throw new ArgumentNullException("savePath");
if (File.Exists(savePath)) return "文件名重复";
try
{
var fs = new FileStream(savePath, FileMode.CreateNew);
var bw = new BinaryWriter(fs);
bw.Write(buff, , buff.Length);
bw.Close();
fs.Close();
}
catch (Exception er)
{
throw new Exception(er.Message);
}
return "保存成功";
} /// <summary>
/// 将图片序列化为二进制流
/// </summary>
/// <param name="imgPath">图片路径</param>
/// <returns>序列化后的二进制流</returns>
public static byte[] SetImgToBytes(string imgPath)
{
if(string.IsNullOrEmpty(imgPath))
throw new ArgumentNullException(imgPath);
try
{
byte[] byteData;
using (var file=new FileStream(imgPath,FileMode.Open,FileAccess.Read))
{
byteData=new byte[file.Length];
file.Read(byteData, , byteData.Length);
file.Close();
}
return byteData;
}
catch (Exception er)
{ throw new Exception(er.Message);
}
} }
C#二进制流的序列化和反序列化的更多相关文章
- IO流的序列化和反序列化
序列化和反序列化的概念: 序列化:把对象转换为字节序列的过程称为对象的序列化.(常见的就是存文件) 反序列化:把字节序列恢复为对象的过程称为对象阿德反序列化. 序列化和反序列化的使用: java.io ...
- java 21 - 13 IO流之序列化和反序列化
序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输.对象 -- 流数据(ObjectOutputStream) 构造方法:ObjectInputStream(InputStream in) ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_1_序列化和反序列化的概述
- 16 IO流(十三)——Object流 序列化与反序列化
Object流.序列化与反序列化 Object流是将 可序列化的对象 进行序列化与反序列化的流. 可序列化的对象:使用关键字Serializable修饰,表示这个对象可以进行序列化与反序列化. 序列化 ...
- json相关注解和序列化与反序列化
使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化: @JsonSerial ...
- java_28 序列化与反序列化
1.序列化和反序列化 序列化:把对象转换为字节序列的过程称为对象的序列化.(常见的就是存文件) 反序列化:把字节序列恢复为对象的过程称为对象阿德反序列化. 2.序列化和反序列化的使用: java.io ...
- C#序列化与反序列化以及深拷贝浅拷贝
基于二进制数据流的序列化和反序列化 /// <summary> /// 序列化 /// </summary> /// <typeparam name="T&qu ...
- [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化
[.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...
- .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化
1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...
随机推荐
- 回忆那些我们曾今铭记过的.NET重点知识
正如标题所说的那样,到底是那些.NET的知识点呢? 接下来就让我带着你们去了解这些知识点吧! 1.接口 2.索引器 3.FOREACH的本质 4.匿名内部类 5.运算符的重载 一.什么是接口? ...
- POJ1860 Currency Exchange(bellman-ford)
链接:http://poj.org/problem?id=1860 Currency Exchange Description Several currency exchange points are ...
- Lua源代码阅读分析问题列表(转)
最近正在阅读lua源码,遇到座灯塔,转载如下: 我个人的习惯是带着问题去研究一个新题目,比如这次阅读Lua代码,暂列下面这些问题. 1)什么是基于栈.基于寄存器的虚拟机(VM)设计?Lua如何实现基于 ...
- 关于全排列 next_permutation() 函数的用法
这是一个c++函数,包含在头文件<algorithm>里面,下面是基本格式. 1 int a[]; 2 do{ 3 4 }while(next_permutation(a,a+n)); 下 ...
- 导向矢量(Steering Vector)
导向矢量是阵列天线的所有阵元对具有单位能量窄带信源的响应. 由于阵列响应在不同方向上是不同的,导向矢量与信源的方向是相互关联的,这种关联的独特性依赖于阵列的几何结构.对于同一阵元阵列,导向矢量的每一个 ...
- 安装subversion
安装subversion需要依赖apr.apr-util.sqlite 下载安装包,放在/usr/file目录 subversion-1.9.4.tar.gz apr-1.5.2.tar.gz apr ...
- .NET Core与.NET Framework、Mono之间的关系
随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...
- 《HiWind企业快速开发框架实战》(1)框架的工作原理
<HiWind企业快速开发框架实战>(1)框架的工作原理 1.HiWind架构 HiWind的基本架构如下: 持久层部分:同时为框架本身的业务服务,也为开发人员的自定义业务服务. 逻辑层: ...
- TDR测试原理
什么是TDR? TDR是英文Time Domain Reflectometry 的缩写,中文名叫时域反射计,是测量传输线特性阻抗的主要工具.TDR主要由三部分构成:快沿信号发生器,采样示波器和探头系统 ...
- iOS 之APP上架
前几天在忙着上线,尽管之前已经上线过一次,但由于本身比较菜,还是状况百出. 好在今天终于成功提交,因此来写写心得. 如果是第一次上线,推荐这篇文章: http://jingyan.baidu.com/ ...