文档章节

C#二进制流的序列化和反序列化

彭泽0902
 彭泽0902
发布于 2016/11/24 18:47
字数 878
阅读 10
收藏 0
点赞 0
评论 0
  1  public class BinaryHelper
  2     {
  3         /// <summary>
  4         /// 将对象序列化为byte[]
  5         /// 使用IFormatter的Serialize序列化
  6         /// </summary>
  7         /// <param name="obj">需要序列化的对象</param>
  8         /// <returns>序列化获取的二进制流</returns>
  9         public static byte[] FormatterObjectBytes(object obj)
 10         {
 11             if(obj==null)
 12                 throw new ArgumentNullException("obj");
 13             byte[] buff;
 14             try
 15             {
 16                 using (var ms = new MemoryStream())
 17                 {
 18                     IFormatter iFormatter = new BinaryFormatter();
 19                     iFormatter.Serialize(ms, obj);
 20                     buff = ms.GetBuffer();
 21                 }
 22             }
 23             catch (Exception er)
 24             {
 25                 throw new Exception(er.Message);
 26             }
 27             return buff;
 28         }
 29 
 30 
 31         /// <summary>
 32         /// 将对象转为二进制文件,并保存到指定的文件中
 33         /// </summary>
 34         /// <param name="name">文件路径</param>
 35         /// <param name="obj">待存的对象</param>
 36         /// <returns></returns>
 37         public static bool BinaryFileSave(string name,object obj)
 38         {
 39             Stream flstr=null;
 40             BinaryWriter binaryWriter=null;
 41             try
 42             {
 43                 flstr = new FileStream(name, FileMode.Create);
 44                 binaryWriter = new BinaryWriter(flstr);
 45                 var buff = FormatterObjectBytes(obj);
 46                 binaryWriter.Write(buff);
 47             }
 48             catch (Exception er)
 49             {
 50                 throw new Exception(er.Message);
 51             }
 52             finally
 53             {
 54                 if (binaryWriter != null) binaryWriter.Close();
 55                 if (flstr != null) flstr.Close();
 56             }
 57             return true;
 58         }
 59 
 60         /// <summary>
 61         /// 将byte[]反序列化为对象
 62         /// 使用IFormatter的Deserialize发序列化
 63         /// </summary>
 64         /// <param name="buff">传入的byte[]</param>
 65         /// <returns></returns>
 66         public static object FormatterByteObject(byte[] buff)
 67         {
 68             if(buff==null)
 69                 throw new ArgumentNullException("buff");
 70             object obj;
 71             try
 72             {
 73                 using (var ms = new MemoryStream())
 74                 {
 75                     IFormatter iFormatter = new BinaryFormatter();
 76                     obj = iFormatter.Deserialize(ms);
 77                 }
 78             }
 79             catch (Exception er)
 80             {
 81                 throw new Exception(er.Message);
 82             }
 83             return obj;
 84         }
 85 
 86 
 87         /// <summary>
 88         /// 将对象序列化为byte[]
 89         /// 使用Marshal的StructureToPtr序列化
 90         /// </summary>
 91         /// <param name="obj">需序列化的对象</param>
 92         /// <returns>序列化后的byte[]</returns>
 93         public static byte[] MarshalObjectByte(object obj)
 94         {
 95             if(obj==null)
 96                 throw new ArgumentNullException("obj");
 97             byte[] buff;
 98             try
 99             {
100                 buff = new byte[Marshal.SizeOf(obj)];
101                 var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buff, 0);
102                 Marshal.StructureToPtr(obj, ptr, true);
103             }
104             catch (Exception er)
105             {
106                 throw new Exception(er.Message);
107             }
108             return buff;
109         }
110 
111         /// <summary>
112         /// 将byte[]序列化为对象
113         /// </summary>
114         /// <param name="buff">被转换的二进制流</param>
115         /// <param name="type">转换成的类名</param>
116         /// <returns></returns>
117         public static object MarshalByteObject(byte[] buff, Type type)
118         {
119             if(buff==null)
120                 throw new ArgumentNullException("buff");
121             if(type==null)
122                 throw new ArgumentNullException("type");
123             try
124             {
125                 var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buff, 0);
126                 return Marshal.PtrToStructure(ptr, type);
127             }
128             catch (Exception er)
129             {
130                 throw new Exception(er.Message);
131             }
132         }
133 
134 
135         /// <summary>
136         /// 将文件转换为byte数组
137         /// </summary>
138         /// <param name="path">文件地址</param>
139         /// <returns>转换后的byte[]</returns>
140         public static byte[] FileObjectBytes(string path)
141         {
142             if(string.IsNullOrEmpty(path))
143                 throw new ArgumentNullException("path");
144             if (!File.Exists(path)) return new byte[0];
145             try
146             {
147                 var fi = new FileInfo(path);
148                 var buff = new byte[fi.Length];
149                 var fs = fi.OpenRead();
150                 fs.Read(buff, 0, Convert.ToInt32(fs.Length));
151                 fs.Close();
152                 return buff;
153             }
154             catch (Exception er)
155             {
156                 throw new Exception(er.Message);
157             }
158         }
159 
160 
161         /// <summary>
162         /// 将byte[]转换为文件并保存到指定的地址
163         /// </summary>
164         /// <param name="buff">需反序列化的byte[]</param>
165         /// <param name="savePath">文件保存的路径</param>
166         /// <returns>是否成功</returns>
167         public static string FileByteObject(byte[] buff, string savePath)
168         {
169             if(buff==null)
170                 throw new ArgumentNullException("buff");
171             if(savePath==null)
172                 throw new ArgumentNullException("savePath");
173             if (File.Exists(savePath)) return "文件名重复";
174             try
175             {
176                 var fs = new FileStream(savePath, FileMode.CreateNew);
177                 var bw = new BinaryWriter(fs);
178                 bw.Write(buff, 0, buff.Length);
179                 bw.Close();
180                 fs.Close();
181             }
182             catch (Exception er)
183             {
184                 throw new Exception(er.Message);
185             }
186             return "保存成功";
187         }
188 
189 
190         /// <summary>
191         /// 将图片序列化为二进制流
192         /// </summary>
193         /// <param name="imgPath">图片路径</param>
194         /// <returns>序列化后的二进制流</returns>
195         public static byte[] SetImgToBytes(string imgPath)
196         {
197             if(string.IsNullOrEmpty(imgPath))
198                 throw new ArgumentNullException(imgPath);
199             try
200             {
201                 byte[] byteData;
202                 using (var file=new FileStream(imgPath,FileMode.Open,FileAccess.Read))
203                 {
204                     byteData=new byte[file.Length];
205                     file.Read(byteData, 0, byteData.Length);
206                     file.Close();
207                 }
208                 return byteData;
209             }
210             catch (Exception er)
211             {
212                 
213                 throw new Exception(er.Message);
214             }
215         }
216 
217 
218 
219     }

 

© 著作权归作者所有

共有 人打赏支持
彭泽0902
粉丝 0
博文 44
码字总数 57771
作品 0
武汉
高级程序员
Android第十八天

一:内存流 1.ByteArrayOutputStream (内存输出流) public ByteArrayOutputStream() public byte[] toByteArray() 创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有...

黄晓磊 ⋅ 2016/06/22 ⋅ 0

聊聊序列化(一)关于序列化协议的一些思考和问题

最近在设计一个RPC框架,需要处理序列化的问题。有很多种序列化协议可以选择,比如Java原生的序列化协议,Protobuf, Thrift, Hessian, Kryo等等,这里说的序列化协议专指Java的基于二进制的协...

真爱2015 ⋅ 2016/07/29 ⋅ 0

.NET对象的XML序列化和反序列化

序列化的概念 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。 比如,一个计数器,数值为2,我们可以用字符串“2”表示。...

王二狗子11 ⋅ 2017/12/26 ⋅ 0

Hadoop序列化中的Writable接口(附部分源码)

序列化是将结构化对象为字节流以便与通过网络进行传输或者写入持久存储。反序列化指的是将字节流转为一系列结构化对象的过程。 序化在分布式数据处理的两列大领域经常出现:进程间通信和永久...

cookqq ⋅ 2013/05/13 ⋅ 1

序列化和反序列化浅析

简介 序列化和反序列化对于现代的程序员来说是一个既熟悉又陌生的概念。说熟悉是因为几乎每个程序员在工作中都直接或间接的使用过它,说陌生是因为大多数程序员对序列化和反序列化的认识仅仅...

andot ⋅ 2016/11/09 ⋅ 0

C#强化系列文章七:序列化和反序列化

序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。 我想最主要...

橘子红了呐 ⋅ 2017/11/05 ⋅ 0

IOS 序列化与反序列化NSKeyedUnarchiver

开篇 1到底这个序列化有何作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中。 ...

今日竹石 ⋅ 2014/01/23 ⋅ 0

Java序列化与反序列化(原生方式与Jackson方式)

image.png Java序列化与反序列化 交流或更多内容请关注我的公众号:nezha_blog 我的技术博客:https://nezha.github.io 微信公众号 当两个进程在进行远程通信时,彼此可以发送各种类型的数据...

哪吒小子 ⋅ 2017/12/14 ⋅ 0

hadoop深入研究:(十)——序列化与Writable接口

转载请写明来源地址:http://blog.csdn.net/lastsweetop/article/details/9193907 所有源码在github上,https://github.com/lastsweetop/styhadoop 简介 序列化和反序列化就是结构化对象和字...

lastsweetop ⋅ 2013/07/05 ⋅ 0

Java复习--IO(输入/输出){Java传统IO体系、Java序列化机制}

本节从三个方面介绍Java输入输出体系,第一部分介绍Java IO,第二部分介绍Java对象的序列化机制,第三部分介绍JavaNIO。 一、Java IO Java的IO是通过java.io包下的类和接口来支持的,主要包括...

Winnie007 ⋅ 2015/09/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java的Excel导出工具类

首先在POM中引入需要的Jar <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>o......

Kxvz ⋅ 4分钟前 ⋅ 0

Java 3DES加密解密

import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.binary.Base64; //算法代码[java] view plain copy /** * 转换成十六进制字......

说回答 ⋅ 11分钟前 ⋅ 0

php 浮点型计算精度问题

今天碰到一个金额计算的问题,浮点数做差,结果有误(精度有问题)。 $a = floatval('6');$b = floatval('4.99');$m = floatval('1');$r = $a - $b;$r = $r - $m;var_dump($r);//f...

stupidboy ⋅ 33分钟前 ⋅ 0

Mahout推荐算法之SlopOne

一、 算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分。如下图,估计UserB对ItemJ的偏好 图(1) 在真实情况下,该方法有如下几个...

xiaomin0322 ⋅ 38分钟前 ⋅ 0

LVM讲解

LVM是什么 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地...

李超小牛子 ⋅ 47分钟前 ⋅ 0

mysql更改密码、连接mysql、mysql常用命令

1. 更改mysql的root账户密码: mysql中root账户和系统root不是一个账户 1.1 更改环境变量PATH,增加mysql绝对路径 由于mysql安装目录为/usr/local/mysql/,所以系统不能直接使用mysql,需把/...

laoba ⋅ 49分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

猫耳m ⋅ 49分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云云栖社区 ⋅ 52分钟前 ⋅ 0

1.03-Maven中使用ueditor富文本编辑器

起因:在maven仓库未找到百度的ueditor的jar包 操作: 1.下载百度的ueditor的jar包 2.打开命令行,切换到ueditor的下载位置,运行一下命令: mvn install:install-file -Dfile=ueditor-1.1....

静以修身2025 ⋅ 58分钟前 ⋅ 0

几道Spring 面试题

1、BeanFactory 接口和 ApplicationContext 接口有什么区别? ApplicationContext 接口继承BeanFactory接口 Spring核心工厂是BeanFactory BeanFactory采取延迟加载,第一次getBean时才会初始...

职业搬砖20年 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部