版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013667895/article/details/78478458
BinaryFormatter以二进制格式序列化和反序列化对象。
BinaryFormatte序列化:将对象转化成二进制,BinaryFormatte反序列化就是将二进制转化为对象;
命名空间: System.Runtime.Serialization.Formatters;
最常用的两个方法:
Deserialize(Stream) 将指定的流反序列化成对象
Serialize(Stream, Object) 将对象序列化到给定的流
两个常用的属性:
Serializable 表示可以被序列化
NonSerializable 屏蔽被序列化
例子:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace Binaryformats
{
internal class Program
{
private static void Main(string[] args)
{
Person p = new Person();
p.Sex = 1;
p.Age = 21;
p.Name = "dfr";
byte[] serBytes = BinaryFormat.Serialize(p); //序列化
Person pp = (Person) BinaryFormat.Deserialize(serBytes); //反序列化,object类转化成自己定义的
Console.WriteLine(pp.Name);
Console.ReadLine();
}
[Serializable]
private class Person //用Serializable做了标记,标识可以被序列化
{
private int _age;
[NonSerialized] private string _name; //用NonSerialized做了标记,标识该字段屏蔽序列化
private int _sex;
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Sex
{
get { return _sex; }
set { _sex = value; }
}
public int Age
{
get { return _sex; }
set { _sex = value; }
}
}
}
public class BinaryFormat
{
public static byte[] Serialize(Object Urobject) //序列化 返回byte[]类型
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream memory = new MemoryStream();
bf.Serialize(memory, Urobject);
byte[] bytes = memory.GetBuffer();
memory.Close();
return bytes;
}
public static object Deserialize(byte[] bytes) //反序列化,返回object类型的
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream memory = new MemoryStream(bytes);
object ss = bf.Deserialize(memory);
memory.Close();
return ss;
}
}
}
NonSerialized作用:被标记的字段都赋成空
结果:
---------------------
作者:一木一百
来源:CSDN
原文:https://blog.csdn.net/u013667895/article/details/78478458
版权声明:本文为博主原创文章,转载请附上博文链接!
object与byte[]的相互转换:
-
/// <summary>
-
/// 工具类:对象与二进制流间的转换
-
/// </summary>
-
class ByteConvertHelper
-
{
-
/// <summary>
-
/// 将对象转换为byte数组
-
/// </summary>
-
/// <param name="obj">被转换对象</param>
-
/// <returns>转换后byte数组</returns>
-
public static byte[] Object2Bytes(object obj)
-
{
-
byte[] buff;
-
using (MemoryStream ms = new MemoryStream())
-
{
-
IFormatter iFormatter = new BinaryFormatter();
-
iFormatter.Serialize(ms, obj);
-
buff = ms.GetBuffer();
-
}
-
return buff;
-
}
-
/// <summary>
-
/// 将byte数组转换成对象
-
/// </summary>
-
/// <param name="buff">被转换byte数组</param>
-
/// <returns>转换完成后的对象</returns>
-
public static object Bytes2Object(byte[] buff)
-
{
-
object obj;
-
using (MemoryStream ms = new MemoryStream(buff))
-
{
-
IFormatter iFormatter = new BinaryFormatter();
-
obj = iFormatter.Deserialize(ms);
-
}
-
return obj;
-
}
-
}
文件与byte数组相互转换:
-
/// <summary>
-
/// 工具类:文件与二进制流间的转换
-
/// </summary>
-
class FileBinaryConvertHelper
-
{
-
/// <summary>
-
/// 将文件转换为byte数组
-
/// </summary>
-
/// <param name="path">文件地址</param>
-
/// <returns>转换后的byte数组</returns>
-
public static byte[] File2Bytes(string path)
-
{
-
if(!File.Exists(path))
-
{
-
return new byte[0];
-
}
-
FileInfo fi = new FileInfo(path);
-
byte[] buff = new byte[fi.Length];
-
FileStream fs = fi.OpenRead();
-
fs.Read(buff, 0, Convert.ToInt32(fs.Length));
-
fs.Close();
-
return buff;
-
}
-
/// <summary>
-
/// 将byte数组转换为文件并保存到指定地址
-
/// </summary>
-
/// <param name="buff">byte数组</param>
-
/// <param name="savepath">保存地址</param>
-
public static void Bytes2File(byte[] buff, string savepath)
-
{
-
if (File.Exists(savepath))
-
{
-
File.Delete(savepath);
-
}
-
FileStream fs = new FileStream(savepath, FileMode.CreateNew);
-
BinaryWriter bw = new BinaryWriter(fs);
-
bw.Write(buff, 0, buff.Length);
-
bw.Close();
-
fs.Close();
-
}
-
}
原文:http://my.oschina.net/Tsybius2014/blog/352409
新增,
Image与byte数组相互转换:
-
/// <summary>
-
/// 从byte数组创建Image
-
/// </summary>
-
public static Image Bytes2Image(byte[] bytes)
-
{
-
System.IO.MemoryStream stream = new System.IO.MemoryStream();
-
stream.Write(bytes, 0, bytes.Length);
-
Image image = Image.FromStream(stream);
-
return image;
-
}
-
/// <summary>
-
/// 将Image转化为byte数组,使用缓存文件中转
-
/// </summary>
-
public static byte[] Image2Bytes_tmpFile(Image image, ImageFormat imageFormat = null)
-
{
-
if (imageFormat == null) imageFormat = ImageFormat.Jpeg;
-
String tmpFilePath = AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.Ticks + ".stream";
-
image.Save(tmpFilePath, imageFormat); // 保存图像到文件
-
byte[] bytes = File2Bytes(tmpFilePath); // 从文件中获取字节数组
-
if (File.Exists(tmpFilePath)) File.Delete(tmpFilePath); //删除文件
-
return bytes;
-
}
反序列化无法找到程序集
提示找不到程序集.
原因是序列化时把序列化类的命名空间等信息保存了,但应用程序和类库的命名空间可能是
不一样的,所以提示找不到程序集.
解决方法如下:
方法1.将dll加入强名称,注册到全局程序集缓存中
方法2.在反序列化使用的IFormatter 对象加入Binder 属性,使其获取要反序列化的对象所在的程序集
示例如下:
public void DeSerialize( byte [] data, int offset)
{
IFormatter formatter = new BinaryFormatter();
formatter.Binder = new UBinder();
MemoryStream stream = new MemoryStream(data, offset, stringlength);
this .m_bodyobject = ( object )formatter.Deserialize(stream);
}
public class UBinder:SerializationBinder
{
public override Type BindToType( string assemblyName, string typeName)
{
Assembly ass = Assembly.GetExecutingAssembly();
return ass.GetType(typeName);
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/scgyyu/archive/2009/06/02/4232371.aspx
项目中碰到要反序列化第三方提供的数据包。
对方序列化时对象为 namespaceA.packetA
但他提供的dll文件命名空间却是 namespaceB.packetA
导致我反序列化失败,最后通过上面介绍的方式实现反序列化
public class UBinder:SerializationBinder
{
public override Type BindToType( string assemblyName, string typeName)
{
if (typeName.EndsWith("packetA")) return typeof(namespaceB.packetA);
Assembly ass = Assembly.GetExecutingAssembly();
return ass.GetType(typeName);
}
}