文档章节

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

彭泽0902
 彭泽0902
发布于 2016/11/24 18:47
字数 878
阅读 10
收藏 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
武汉
高级程序员
私信 提问
C# 的三种序列化方法

序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。 序列化一个对象...

oschina
2013/01/31
12.5K
3
Android第十八天

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

黄晓磊
2016/06/22
12
0
聊聊序列化(一)关于序列化协议的一些思考和问题

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

真爱2015
2016/07/29
32
0
深入学习Servlet中的监听器以及用法

在域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。      这三个监听器接口分别是ServletCont...

恋码之子
07/30
0
0
.NET对象的XML序列化和反序列化

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

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

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
8
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
14
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
14
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
8
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部