在某些需求下,需要将一个类进行序列化,存入数据库,等另一个操作从数据库中取出,再反序列化成类.

一般实现:

 #region 把一个对象序列化成流/// <summary>/// 把一个对象序列化成流/// </summary>/// <param name="obj"></param>/// <returns></returns>internal byte[] SerializeObject(object obj){MemoryStream m = new MemoryStream();BinaryFormatter bf = new BinaryFormatter();bf.Serialize(m, obj);//再把MemoryStream   流转成byte[]形式!   byte[] buffer = m.GetBuffer();m.Close();m.Dispose();return buffer;}#endregion#region 把一个流转成对象/// <summary>/// 把一个流转成对象/// </summary>/// <param name="buffer"></param>/// <returns></returns>internal object UnSerializeObject(byte[] buffer){MemoryStream m = new MemoryStream(buffer);BinaryFormatter deserializer = new BinaryFormatter();object obj = (deserializer.Deserialize(m));//反序列化得到的对象   m.Close();m.Dispose();return obj;}#endregion}

当需求发生变化,序列化与反序列不在一个project(需要序列化的类写在project中,而非共同的ClassLibrary)中进行时,用以上方法反序列化就会出错,会提示找不到类.

类的信息:

[NameSpace.ClassName,assemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]

此时就需要重写SerializationBinder,修改类的命空间

代码:

 internal static object UnSerializeObject(byte[] buffer){MemoryStream m = new MemoryStream(buffer);BinaryFormatter deserializer = new BinaryFormatter();deserializer.Binder = new OverrideSerializationBinder();object obj = deserializer.Deserialize(m);//反序列化得到的对象   m.Close();m.Dispose();return obj;}/// <summary>/// 重写SerializationBinder ,让序列化的对象从当前数据程序集中取出./// </summary>sealed class OverrideSerializationBinder : System.Runtime.Serialization.SerializationBinder{public override Type BindToType(string assemblyName, string typeName){return Type.GetType( typeName);}}

重写SerializationBinder后,看似不错了.但有时候,也会碰上到麻烦,比如,你需要序列化的类中有泛型的存在,或者assemblyName不相同,NameSpace也不相同.

    [Serializable]public class class1{List<class2> Class2List;}[Serializable]public class class2{}

此时在BindToType中截取到的typeName就是为以下信息,又回到了上一错误.

例:

System.Collections.Generic.List`1[[NameSpace.ClassName, assemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

解决方法:

 internal static object UnSerializeObject(byte[] buffer, Type type){MemoryStream m = new MemoryStream(buffer);BinaryFormatter deserializer = new BinaryFormatter();deserializer.Binder = new OverrideSerializationBinder() { NewNameSpace = type.FullName.Substring(0, type.FullName.LastIndexOf(".")) };object obj = deserializer.Deserialize(m);//反序列化得到的对象   m.Close();m.Dispose();return obj;}/// <summary>/// 重写SerializationBinder ,让序列化的对象从当前数据程序集中取出./// </summary>sealed class OverrideSerializationBinder : System.Runtime.Serialization.SerializationBinder{public string OldNameSpace = string.Empty;public string NewNameSpace;public override Type BindToType(string assemblyName, string typeName){//Type t = Type.GetType("System.Collections.Generic.List`1[["+NewNameSpace+".MarketMediaCondition]]");//得到旧的命名空间名称if (OldNameSpace == string.Empty)OldNameSpace = typeName.Substring(0, typeName.LastIndexOf("."));//针对处理有泛型的if (typeName.IndexOf("System.Collections.Generic") == 0){typeName = typeName.Split(',')[0];typeName += "]]";}string newName = typeName.Replace(OldNameSpace, NewNameSpace);return Type.GetType(newName);}}

或许还有更好的解决方法.

希望大家能讨论一下.

转载于:https://www.cnblogs.com/SoGood/archive/2010/09/17/1829476.html

程序中,序列化与反序列化相关推荐

  1. java中序列化与反序列化_Java中的序列化

    java中序列化与反序列化 Java提供了一种称为序列化的机制,以按字节的有序或字节序列的形式持久化Java对象,其中包括对象的数据以及有关对象的类型和存储在对象中的数据类型的信息. 因此,如果我们已 ...

  2. java中序列化与反序列化

    一.基本概念 1.序列化和反序列化的定义: (1)Java序列化就是指把Java对象转换为字节序列的过程Java反序列化就是指把字节序列恢复为Java对象的过程. (2)序列化最重要的作用:在传递和保 ...

  3. Java 中序列化与反序列化

    一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...

  4. keypair java_如何在Java中序列化和反序列化RSA KeyPair

    我想在我的Java应用程序中实现一些非常基本的安全性,但是一开始我就陷入了困境. 我想做的是这样的: 1-生成RSA密钥对 2将这些密钥以序列化形式存储在数据库中,以便在下次运行该应用程序时重新创建它 ...

  5. ASP.NET中序列化与反序列化-以显示上一次登录的信息为例

    场景 ASP.NET中新建Web网站并部署到IIS上(详细图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107199 ...

  6. django中序列化、反序列化过程

    一.定义序列化器 a.如果需要使用DRF框架来实现序列化.反序列化.数据库操作,在子应用中创建serializers.py文件 b.文件名推荐命名为serializers.py 在serializer ...

  7. 集合中的实体类根据一个字段合并_JAVA中序列化与反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化: 把字节序列恢复为对象的过程称为对象的反序列化. 说人话:就是JAVA对象需要保存或通过网络传输必须保存为二进制才行,所以就需要 ...

  8. php中序列化与反序列化

    http://www.cnblogs.com/A-Song/archive/2011/12/13/2285619.html 转自:http://qing.weibo.com/tag/unseriali ...

  9. fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...

    点击上方蓝字设为星标 每天傍晚伴你一起成长! Java 中的序列化和反序列化是一个重要的编程概念.它适用于所有主要的编程语言.在本章中,我们将尝试在Java语言的上下文中理解此概念.在本章的最后,我们 ...

最新文章

  1. 另辟蹊径,中科院自动化所等首次用图卷积网络解决语义分割难题
  2. oracle10默认备份路径,oracle 10g RMAN备份及恢复
  3. 云数据库MongoDB全面支持3.4版本,支持多存储引擎
  4. 基于Anaconda安装GPU版PyTorch深度学习开发环境
  5. raspberry pi_通过串行蓝牙从Raspberry Pi传感器单元发送数据
  6. sqlite C/C++ API
  7. ShardingSphere(五) 公共表配置,实现读写改操作
  8. 华为删除dhcp地址池_配置设备作为DHCP中继示例
  9. 2018深度学习十大趋势:元学习成新SGD,多数硬件创企将失败
  10. 工厂设计模式——抽象工厂
  11. ubuntu生成pem证书连接服务器(已验证)
  12. django+echarts数据可视化(NBA球队数据可视化02)!
  13. 如何查看iOS版本?
  14. 商业综合体能耗在线监测管理系统_商场管理平台
  15. 鸿蒙系统会碎片化吗,鸿蒙系统讲解决安卓碎片化问题,4G流畅度媲美12G!
  16. 【AI视野·今日CV 计算机视觉论文速览 第157期】Mon, 16 Sep 2019
  17. 八大排序 详解(下)——指向函数的指针 的使用
  18. 加密交易所的新战场:高频交易
  19. anaconda3最新安装教程
  20. Java的GUI编程---AWT介绍

热门文章

  1. ReactNative组件导出
  2. ★LeetCode(453)——最小移动次数使数组元素相等(JavaScript)
  3. idea系---懒人
  4. 【jQuery学习】—jQuery对象的访问
  5. http与https的作用与区别
  6. 你做过的第一次事情有什么有趣的事吗?
  7. 新零售时代招商的新鲜玩法——用全网联动 促销活动来招商
  8. 为什么你总感觉情绪低落心情颓废?
  9. 春节后赚钱风口在哪?
  10. 问你个问题:50万存款算多吗?