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往里 ...
随机推荐
- Lua pureMVC
分享一个lua语言版本的pureMVC. 这个是一个根据AS3(ActionScript 3) pureMVC而转换过来的lua pureMVC.所有的接口完全跟AS3版本一致,本来是想用在项目之中的 ...
- ffmpeg编译与移植问题
1.下载ffmpeg. 下载网址:http://www.ffmpeg.org/download.html 2.解压缩 tar -zxvf ffmpeg-2.0.1.tar.gz 3.配置,生成Make ...
- Eclipse更新SDK速度慢,解决办法
在SDK Manager -> tools -> options中: HTTP Proxy Server: mirrors.neusoft.edu.cn HTTP Proxy Port: ...
- myeclipse中导入js报如下错误Syntax error on token "Invalid Regular Expression Options", no accurate correc
今天在使用bootstrap的时候引入的js文件出现错误Syntax error on token "Invalid Regular Expression Options", no ...
- Wine——在Linux上运行Windows软件
官网:https://www.winehq.org/ 参考: wikipedia 教你使用Wine在Linux上运行Windows软件 如何安装和使用Wine,以便在Linux上运行Windows应用 ...
- 建模元件有哪些在MapleSim中
信号库:包含通用信号模块.布尔.控制器.离散信号模块.信号源.线性信号模块.非线性信号模块.时间离散信号模块.查询表.信号转换器.数学运算.关系元件.特殊信号模块,应用案例. 电子库:包含电阻.运算放 ...
- SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager
SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager http://www.systoolsgroup.co ...
- Excel导入导出组件的设计
前言: 距离一篇文章,又八九个月过去了,随着在园子露脸的次数越来越少,正如我们淡忘上一波大神那样,我们也正下一波所淡忘. 这八九个月,前前后,游走在十来个项目上,忙,却找不到成就感. 人过30后,也是 ...
- Expert 诊断优化系列------------------语句调优三板斧
前面三篇通过CPU.内存.磁盘三巨头,讲述了如何透过现在看本质,怎样定位服务器三巨头反映出的问题.为了方便阅读给出链接: SQL SERVER全面优化-------Expert for SQL Ser ...
- ENode框架Conference案例分析系列之 - 复杂情况的读库更新设计
问题背景 Conference案例,是一个关于在线创建会议(类似QCon这种全球开发者大会).在线管理会议位置信息.在线预订某个会议的位置的,这样一个系统.具体可以看微软的这个项目的主页:http:/ ...