序列化反序列化 (binary/xml) - 常用代码搜集,方便复用(转)
二进制序列化
首先。你被序列化的类需要用[Serializable]特性修饰,例如:
- [Serializable]
- public class AA
- {
- public int i = 5;
- }
那么你可以用如下方法序列化和反序列化:
- /// <summary>
- /// 序列化为二进制字节数组
- /// </summary>
- /// <param name="request">要序列化的对象 </param>
- /// <returns>字节数组 </returns>
- public static byte[] SerializeBinary<T>(T request)
- {
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
- System.IO.MemoryStream memStream = new System.IO.MemoryStream();
- serializer.Serialize(memStream, request);
- return memStream.GetBuffer();
- }
- /// <summary>
- /// 从二进制数组反序列化得到对象
- /// </summary>
- /// <param name="buf">字节数组 </param>
- /// <returns>得到的对象 </returns>
- public static T DeserializeBinary<T>(byte[] buf)
- {
- System.IO.MemoryStream memStream = new MemoryStream(buf);
- memStream.Position = 0;
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializer =
- new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
- T newobj = (T)deserializer.Deserialize(memStream);
- memStream.Close();
- return newobj;
- }
调用方法
- AA p = new AA();
- p.i = 15;
- byte[] bytes = SerializeBinary<AA>(p);
- AA p2 = DeserializeBinary<AA>(bytes);
源自另一博客的一个非泛型序列化方法,将其修改为泛型写法,主要是方便自己查找。
原文地址:http://www.cnblogs.com/luckeryin/archive/2009/06/05/1496698.html
XML序列化
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Xml.Serialization;
- using System.IO;
- namespace RegexActivator
- {
- public class ExtendMethods
- {
- public static void Serial<T>(T[] items, string path)
- {
- XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]));
- TextWriter writer = new StreamWriter(path);
- try
- {
- xmlSerializer.Serialize(writer, items);
- }
- finally
- {
- writer.Close();
- }
- }
- public static T[] Deserial<T>(string path)
- {
- if (!File.Exists(path)) return new T[0];
- XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]));
- FileStream fs = new FileStream(path, FileMode.Open);
- T[] items;
- try
- {
- items = (T[])xmlSerializer.Deserialize(fs);
- }
- finally
- {
- fs.Close();
- }
- return items;
- }
- }
- }
c#序列化Hashtable的例子
- public void Test()
- {
- Hashtable hash = new Hashtable();
- hash.Add(1, "one");
- hash.Add(2, "two");
- hash.Add(3, "three");
- hash.Add(4, "four");
- //序列化
- BinaryFormatter serializer = new BinaryFormatter();
- FileStream write_stream = new FileStream("my_hash.bin", FileMode.OpenOrCreate, FileAccess.Write);
- serializer.Serialize(write_stream, hash);
- write_stream.Close();
- //反序列化
- FileStream reade_stream = new FileStream("my_hash.bin", FileMode.Open, FileAccess.Read);
- BinaryFormatter deserializer = new BinaryFormatter();
- Hashtable newHash = (Hashtable)deserializer.Deserialize(reade_stream);
- reade_stream.Close();
- foreach (var key in newHash.Keys)
- {
- Console.WriteLine("Key:" + key.ToString() + "/tValue:" + newHash[key].ToString());
- }
- }