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#二进制流的序列化和反序列化的更多相关文章

  1. IO流的序列化和反序列化

    序列化和反序列化的概念: 序列化:把对象转换为字节序列的过程称为对象的序列化.(常见的就是存文件) 反序列化:把字节序列恢复为对象的过程称为对象阿德反序列化. 序列化和反序列化的使用: java.io ...

  2. java 21 - 13 IO流之序列化和反序列化

    序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输.对象 -- 流数据(ObjectOutputStream) 构造方法:ObjectInputStream(InputStream in) ...

  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_1_序列化和反序列化的概述

  4. 16 IO流(十三)——Object流 序列化与反序列化

    Object流.序列化与反序列化 Object流是将 可序列化的对象 进行序列化与反序列化的流. 可序列化的对象:使用关键字Serializable修饰,表示这个对象可以进行序列化与反序列化. 序列化 ...

  5. json相关注解和序列化与反序列化

    使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化: @JsonSerial ...

  6. java_28 序列化与反序列化

    1.序列化和反序列化 序列化:把对象转换为字节序列的过程称为对象的序列化.(常见的就是存文件) 反序列化:把字节序列恢复为对象的过程称为对象阿德反序列化. 2.序列化和反序列化的使用: java.io ...

  7. C#序列化与反序列化以及深拷贝浅拷贝

    基于二进制数据流的序列化和反序列化 /// <summary> /// 序列化 /// </summary> /// <typeparam name="T&qu ...

  8. [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化

    [.net 面向对象程序设计进阶]  (9)  序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...

  9. .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化

    1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...

随机推荐

  1. reconnectingwebsocket.js

    // MIT License: // // Copyright (c) 2010-2012, Joe Walnes // // Permission is hereby granted, free o ...

  2. Nginx 配置从零开始

    作为一个 nginx 的初学者记录一下从零起步的点滴. 基本概念 Nginx 最常的用途是提供反向代理服务,那么什么反向代理呢?正向代理相信很多大陆同胞都在这片神奇的土地上用过了,原理大致如下图: 代 ...

  3. ubuntu自定义分辨率

    首先说下为啥要专门敲个文章来说明这个问题,因为我最近入手了一台分辨率为3200*1800的高分辨率笔记本,但使用的时候发现现在的操作系统及其诸多软件对高分辨率屏幕的支持真的是太烂,字体发虚或者变得非常 ...

  4. win 8 换 win7 注意事项

    win8 换win7 硬盘格式修改一下gpt 格式转换为mbr模式 当进入到要选择安装到某一个盘时,由于磁盘的类型不同,会提示:“选中的磁盘采用GPT分区形式无法安装系统”.这时需要重新设置分区形式( ...

  5. 设置Android Studio启动时可选最近打开过的工程

    Android Studio启动时,默认会打开最近关闭的工程. 如果想Android Studio在启动时,打开欢迎界面(Welcome to Android Studio界面),则可以通过设置Set ...

  6. Unity依赖注入使用详解

    写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册 ...

  7. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  8. 通过扩展让ASP.NET Web API支持W3C的CORS规范

    让ASP.NET Web API支持JSONP和W3C的CORS规范是解决"跨域资源共享"的两种途径,在<通过扩展让ASP.NET Web API支持JSONP>中我们 ...

  9. php单条件查询,关键字查询

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. How to Use Android ADB Command Line Tool

    Android Debug Bridge (adb) is a tool that lets you manage the state of an emulator instance or Andro ...