国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

編寫高質量代碼改善C#程序的157個建議——建議55:利用定制特性減少可序列化的字段

2019-11-14 14:05:56
字體:
來源:轉載
供稿:網友

建議55:利用定制特性減少可序列化的字段

特性(attribute)可以聲明式地為代碼中的目標元素添加注釋。運行時可以通過查詢這些托管塊中的元數據信息,達到改變目標元素運行時行為的目的。System.Runtime.Serialization命名空間下,有4個這樣的特性:

  • OnDeserializedAttribute,當它應用于某方法時,會指定在對象反序列化后立即調用此方法。
  • OnDeserializingAttribute,當他應用于某方法是,會指定在反序列化對象時調用此方法。
  • OnSerializedAttribute,當它應用于某方法時,會指定在對象序列化后立即調用此方法。
  • OnSerializingAttribute,當他應用于某方法是,會指定在序列化對象時調用此方法。

利用這些特性,可以更加靈活地處理序列化和反序列化。例如,我們可以利用這一點,進一步減少某些可序列化的字段。

Person類由ChineseName、FirstName、LastName字段組成:

    [Serializable]    class Person    {        public string FirstName;        public string LastName;        public string ChineseName;    }

我們知道,ChineseName實際可以有FirstName和LastName推斷出,所以這意味著ChineseName不需要被序列化。這時候,我們就可以利用特性,提供一個方法在序列化完成后計算ChineseName的值:

    class PRogram    {        static void Main()        {            Person liming = new Person() { FirstName = "Ming", LastName = "Li", ChineseName = "Li Ming" };            BinarySerializer.SerializeToFile(liming, @"c:/", "Person.txt");            Person person = BinarySerializer.DeserializeFromFile<Person>(@"c:/Person.txt");            Console.WriteLine(person.ChineseName);        }    }    [Serializable]    class Person    {        public string FirstName;        public string LastName;        [NonSerialized]        public string ChineseName;        [OnDeserializedAttribute]        void OnSerialized(StreamingContext context)        {            ChineseName = string.Format("{0} {1}", LastName, FirstName);        }    }

序列化工具類:

    public class BinarySerializer    {        //將類型序列化為字符串        public static string Serialize<T>(T t)        {            using (MemoryStream stream = new MemoryStream())            {                BinaryFormatter formatter = new BinaryFormatter();                formatter.Serialize(stream, t);                return System.Text.Encoding.UTF8.GetString(stream.ToArray());            }        }        //將類型序列化為文件        public static void SerializeToFile<T>(T t, string path, string fullName)        {            if (!Directory.Exists(path))            {                Directory.CreateDirectory(path);            }            string fullPath = Path.Combine(path, fullName);            using (FileStream stream = new FileStream(fullPath, FileMode.OpenOrCreate))            {                BinaryFormatter formatter = new BinaryFormatter();                formatter.Serialize(stream, t);                stream.Flush();            }        }        //將字符串反序列化為類型        public static TResult Deserialize<TResult>(string s) where TResult : class        {            byte[] bs = System.Text.Encoding.UTF8.GetBytes(s);            using (MemoryStream stream = new MemoryStream(bs))            {                BinaryFormatter formatter = new BinaryFormatter();                return formatter.Deserialize(stream) as TResult;            }        }        //將文件反序列化為類型        public static TResult DeserializeFromFile<TResult>(string path) where TResult : class        {            using (FileStream stream = new FileStream(path, FileMode.Open))            {                BinaryFormatter formatter = new BinaryFormatter();                return formatter.Deserialize(stream) as TResult;            }        }    }

 

 

 

 

轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽阳市| 南安市| 伊宁县| 鸡东县| 九寨沟县| 柳州市| 海晏县| 华宁县| 大余县| 上饶市| 固始县| 沁阳市| 天祝| 克拉玛依市| 正蓝旗| 赤壁市| 吉首市| 泽普县| 富川| 甘德县| 景泰县| 谢通门县| 祁连县| 杨浦区| 城步| 额敏县| 唐海县| 平邑县| 车致| 新安县| 黄龙县| 富民县| 花莲县| 乌拉特后旗| 安国市| 夹江县| 海门市| 澄迈县| 游戏| 会昌县| 新野县|