国产探花免费观看_亚洲丰满少妇自慰呻吟_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個建議》陸敏技


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 织金县| 全州县| 尼玛县| 新河县| 夏邑县| 大理市| 喀什市| 沅江市| 宝兴县| 邳州市| 太湖县| 华容县| 普定县| 綦江县| 昭苏县| 元江| 图木舒克市| 德令哈市| 唐河县| 新乐市| 禄劝| 正定县| 东兰县| 建平县| 乡宁县| 华宁县| 右玉县| 全南县| 梅州市| 蒙自县| 武清区| 鸡西市| 汾西县| 孝义市| 镇雄县| 保康县| 仙桃市| 渭源县| 西林县| 察哈| 和龙市|