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往里 ...
随机推荐
- SMA、SMB、SMC封装的二极管
以常见的贴片肖特基二极管SS14 SS24 SS34为例,三种管子区别主要在电流上,有三种封装:SMA.SMB.SMC. 从成本和体积来说,优先选用最小尺寸的SMA/DO-214AC封装,其他封装一般 ...
- C# 5.0 异步编程
在C#5.0中,增加了一个强大的新功能--异步编程.( .NET FrameWork4.5 版本) 它以两个新型关键字出现: ·async ·await 1.Async方法有三种返回类型: asyn ...
- nodejs学习之加密
Nodejs中的加密是Crypto模块, 1.md5的使用 var crypto = require("crypto"); //创建 var md5 = crypto.create ...
- SQL Server
1.通过触发器来级联删除: 具体的触发器代码如下: Create TRIGGER [dbo].[DeleteRelatedProducts] ON [dbo].[ProductCategory] A ...
- nodejs 模块恩仇录
anywhere 一句话:随时随地将你的当前目录变成一个静态文件服务器的根目录. 安装 npm install anywhere -g anywhere -h localhost -p 8060 fa ...
- 搭建spark环境
1.wget http://www.apache.org/dyn/closer.cgi/spark/spark-1.2.0/spark-1.2.0-bin-hadoop2.4.tgz
- Delphi XE5 支持的Android 版本
Delphi XE5 已经支持Android应用开发. 那XE5支持Android的哪些版本呢?Delphi编译的APP能部署到Gingerbread (2.3.3-2.3.7), Ice Crea ...
- 为什么要重写hashcode() 方法
Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 那么我们怎么判断两个元素是否重复呢? 这就是 ...
- dereverberation
Typical Approach to Dereverberation DOAs Estimating the directions of arrival of a direct source sig ...
- Google分布式构建软件之一:获取源代码
本文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但尊重作者版权,注名原文地址. 在Google,所有的产品都是在主干上开发的.这样的好处:每个人都可以查看和修改代码, ...