最近看了一下同事写的代码,其中包含这么一个功能,叫序列化与反序列化。
说一下概念,
序列化: 将数据结构或对象转换成二进制串的过程
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
很多情况下,我们需要将数据进行持久化操作,即将数据写入到文件中,我们可以通过IO操作,或者序列化操作。而序列化可以将一个对象持久化到文件中,保存在二进制文件中。
这是我在百度经验找到的代码进行了改编:包括XML、SOAP、Binary的序列化与反序列化代码。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
namespace ConsoleApplication1.SerializationAndDeserialization
{
class SerializationAndDeserialization
{
public static void XMLSerialize<T>(T t, string filePath)
{
try
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (StreamWriter sw = new StreamWriter(filePath, false))
{
formatter.Serialize(sw, t);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public static T XMLDeserialize<T>(string filePath)
{
try
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (StreamReader sr = new StreamReader(filePath, false))
{
return (T)formatter.Deserialize(sr);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public static void BinarySerialize<T>(T t, string filePath)
//SoapSerialize
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
//SoapFormatter formatter=new SoapFormatter();
using (Stream stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)
)
{
formatter.Serialize(stream, t);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public static T BinaryDeserialize<T>(string filePath)
//SoapDeserialize
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
//SoapFormatter formatter=new SoapFormatter();
using (Stream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
return (T)formatter.Deserialize(stream);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
[Serializable]
public class TestSerializationObject
{
public string Attr1
{
get;
set;
}
public string Attr2
{
get;
set;
}
public int Attr3
{
get;
set;
}
}
}
class Program
{
public static void Main(string[] args)
{
TestSerializationAndDeserialization();
Console.Read();
}
#region 测试序列化和反序列化
public static void TestSerializationAndDeserialization()
{
TestSerializationObject obj=new TestSerializationObject();
obj.Attr1 = "001";
obj.Attr2 = "002";
obj.Attr3 = 1;
SerializationAndDeserialization.SerializationAndDeserialization.XMLSerialize(obj,@"F:\1.xml");
TestSerializationObject obj2 = new TestSerializationObject();
obj2.Attr1 = "001";
obj2.Attr2 = "002";
obj2.Attr3 = 1;
SerializationAndDeserialization.SerializationAndDeserialization.BinarySerialize(obj2, @"F:\2.txt");
}
#endregion
}
注意那个被序列化的类,需要使用Serializable特性,才能被Binary序列化。
看看生成的文件,
演示了序列化,反序列化你可以试试哦~
Console.WriteLine(SerializationAndDeserialization.SerializationAndDeserialization.XMLDeserialize<TestSerializationObject>(@"F:\1.xml").Attr1);
咦,CSDN出bug了,经常乱复制,乱关闭窗口。上传图片最后不显示?