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

  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     }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

聊聊hystrix的BucketedCounterStream

hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/metric/consumer/BucketedCou...

401
来自专栏Java3y

JDBC【事务、元数据、改造JDBC工具类】

1.事务 一个SESSION所进行的所有更新操作要么一起成功,要么一起失败 举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账...

3398
来自专栏祝威廉

对Spark的那些【魔改】

这两年做streamingpro时,不可避免的需要对Spark做大量的增强。就如同我之前吐槽的,Spark大量使用了new进行对象的创建,导致里面的实现基本没有...

791
来自专栏weixuqin 的专栏

spring 学习(四): spring 的 jdbcTemplate 操作

spring 针对 javaee 的每一层,都提供了相应的解决技术,jdbcTemplate 的主要操作在 dao 层。

512
来自专栏AndroidTv

【Andorid源码解析】View.post() 到底干了啥

emmm,大伙都知道,子线程是不能进行 UI 操作的,或者很多场景下,一些操作需要延迟执行,这些都可以通过 Handler 来解决。但说实话,实在是太懒了,总感...

3376
来自专栏积累沉淀

strom架构和构建Topology

1.Hadoop的MapReduce与Storm的topology有什么不一样的地方? 2.Nimbus与hadoop的jobtracer作用是否类似? ...

1807
来自专栏好好学java的技术栈

jdbc就是这么简单

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问...

563
来自专栏Phoenix的Android之旅

Java中如何操作超大数

我们知道Integer的最大值是 2^31 - 1,Long最大值是 2^63 -1, 不管是32位机还是64位机都是这样, 通常来说我们要操作一个大于 Int...

491
来自专栏好好学java的技术栈

jdbc就是这么简单

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问...

552
来自专栏cloudskyme

OTL技术应用

什么是OTL:OTL 是 Oracle, Odbc and DB2-CLI TemplateLibrary 的缩写,是一个操控关系数据库的C++模板库,它目前几...

3726

扫码关注云+社区