網(wǎng)站建設平臺漢龍網(wǎng)頁制作官方網(wǎng)站
.NET框架提供了兩種種串行化的方式:
1、是使用BinaryFormatter進行串行化;
2、使用XmlSerializer進行串行化。
????????第一種方式提供了一個簡單的二進制數(shù)據(jù)流以及某些附加的類型信息,而第二種將數(shù)據(jù)流格式化為XML存儲。可以使用[Serializable]屬性將類標志為可序列化的。如果某個類的元素不想被序列化,1、可以使用[NonSerialized]屬性來標志,2、可以使用[XmlIgnore]來標志。
????????序列化意思指的是把對象的當前狀態(tài)進行持久化,一個對象的狀態(tài)在面向?qū)ο蟮某绦蛑惺怯蓪傩员硎镜?#xff0c;所以序列化類的時候是從屬性讀取值以某種格式保存下來,而類的成員函數(shù)不會被序列化,.net存在幾種默認提供的序列化,二進制序列化,xml和json序列化會序列化所有的實例共有屬性。
????????這里簡單介紹:BinaryFormatter以二進制格式序列化和反序列化對象。
????????BinaryFormatte序列化:將對象轉化成二進制,BinaryFormatte反序列化就是將二進制轉化為對象;
????????命名空間: System.Runtime.Serialization.Formatters;
????????最常用的兩個方法:
????????????????Deserialize(Stream) ????將指定的流反序列化成對象
????????????????Serialize(Stream,?Object) ????將對象序列化到給定的流
????????兩個常用的屬性:
????????????????Serializable ????表示可以被序列化
????????????????NonSerializable ????屏蔽被序列化
**************************************************************************************************************
?簡單示例:
namespace Model
{[Serializable]public class Config{ [NonSerialized] // 表示下面這個age字段不進行序列化private int age{ get; set; }public string Language { get; set; }public bool IsAutoBackup { get; set; }public int BackupTimeForHour { get; set; }public string LastTimeRestoreDBFile { get; set; }public DateTime? LastAutoBackupDateTime { get; set;}public bool IsSupportHis { get; set; }//序列化 fileName:文件地址public void SaveTo(string fileName){using (MemoryStream ms = new MemoryStream()){BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(ms, this);File.WriteAllBytes(fileName, ms.ToArray());}}//反序列化public static DSConfig LoadFromFile(string fileName){try{if (!File.Exists(fileName))return null;else{byte[] buff = File.ReadAllBytes(fileName);using (MemoryStream ms = new MemoryStream(buff)){BinaryFormatter formatter = new BinaryFormatter();return (DSConfig)formatter.Deserialize(ms);}}}catch (Exception ex){}return null;}}
}
調(diào)用示例
private const string CONFIGNAME = "b1b4af87-1870-11e9-a31b-8cec4b4fece0.cfg";
public static string ConfigName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Viewer",CONFIGNAME);
Config config = Config.LoadFromFile(ConfigName);
//對Config類里面參數(shù)賦值后保存
Config.SaveTo(ConfigName);
**************************************************************************************************************?
BinaryFormatte序列化,示例二:
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();//使用using 可以避免忘記釋放bf.Serialize(memory, Urobject);byte[] bytes = memory.GetBuffer();memory.Close();return bytes;//或者采用方法:using (MemoryStream ms = new MemoryStream(buff)){}}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;}}
}
**************************************************************************************************************