序列化基础概念:
序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。
序列化是通过某种形式(例如二进制流)把数据存储到文件;
反序列化则是通过同样的形式把文件中的数据恢复成原本的样子取出来。
二进制(流)序列化:
二进制(流)序列化是一种将数据写到输出流,以使它能够用来自动重构成相应对象的机制。二进制,其名字就暗示它的必要信息是保存在存储介质上,而这些必要信息要求创建一个对象的精确的二进制副本。在二进制(流)序列化中,整个对象的状态都被保存起来,而XML序列化只有部分数据被保存起来。为了使用序列化,我们需要引入System.Runtime.Serialization.Formatters.Binary名字空间. 下面的代码使用BinaryFormatter类序列化.NET中的string类型的对象。
字符串的序列化和反序列化:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace SerializationTest
{
class Program
{
static void Main(string[] args)
{
string str = "test string for serialization";
//这里创建文件流打开文件的位置表示是在linux下的,linux不以文件后缀区分文件类型,windows系统请改为对应形式
FileStream write = new FileStream("/home/stringserialize", FileMode.Create, FileAccess.Write ,FileShare.None);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(write, str);
write.Close();
FileStream read = new FileStream("/home/stringserialize", FileMode.Open , FileAccess.Read ,FileShare.Read );
string s = (string)b.Deserialize(read);
read.Close();
Console.WriteLine(read);
Console.ReadLine();
}
}
}
类的序列化和反序列化:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApplicationLin {
internal class Program {
[Serializable]
public class TStuData {
public string Name;
public string Age;
public string Birth;
public string Major;
public string Class;
}
public static void Main(string[] args) {
TStuData ts = new TStuData();
ts.Name = "John";
ts.Age = "14";
ts.Birth = "1998-03-12";
ts.Major = "computer";
ts.Class = "1604";
Stream write = new FileStream("/home/jinxi/pycode/TStu",FileMode.Create);
IFormatter b = new BinaryFormatter();
b.Serialize(write,ts);
write.Close();
//类的反序列化要先声明对象,然后在通过文件流反序列化读取内容到对象中
TStuData t = new TStuData();
Stream read = new FileStream("/home/jinxi/pycode/TStu",FileMode.Open,FileAccess.Read,FileShare.Read);
t = b.Deserialize(read) as TStuData;
read.Close();
Console.WriteLine(t.Name);
Console.WriteLine(t.Age);
Console.WriteLine(t.Birth);
Console.WriteLine(t.Major);
Console.WriteLine(t.Class);
Console.ReadLine();
}
}
}
参考:
https://www.oschina.net/translate/serialization-in-csharp
https://www.cnblogs.com/qqflying/archive/2008/01/13/1037262.html