首页 > 代码库 > 利用反射实现序列化和反序列化
利用反射实现序列化和反序列化
主程序
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;using System.Xml.Serialization;using System.Diagnostics;using System.Reflection;using System.Xml;using 用户自定义输入;namespace ProtoBuf{ class Program { static void Main(string[] args) { Console.WriteLine("请输入想要创建的Person类数量:"); int ListNumber = Convert.ToInt32(Console.ReadLine()); var list = InitData(ListNumber); List<Person> NewList = new List<Person>(); MemoryStream stream = new MemoryStream(); TestSerialize(stream, list, NewList); Console.Read(); } private static List<Person> InitData(int listCount) { List<Person> list = new List<Person>(); for (var i = 0; i < listCount; i++) //i < 1024*100; { var person = new Person { Sno = i, Name = "Name" + i, Age = i, NowTime = System.DateTime.Now, IsInShool = true, Country = 1, Language = i, Professional = i, Study = 123, FatherName = i, MotherName = "motherName" + i }; list.Add(person); } return list; } static void TestSerialize(MemoryStream Stream, List<Person> list, List<Person> Newlist) { //定义测试次数和统计时间 int count = 20; double time1 = 0, time2 = 0; //测试序列化 Stopwatch PS = new Stopwatch(); for (int i = 0; i < count; i++) { PS.Start(); Serialize(Stream, list); PS.Stop(); time1 += PS.Elapsed.TotalMilliseconds; } Console.WriteLine("序列化20次平均用时" + time1 / count); //测试序列化输出 //Test.PrintStream(Stream); //测试反序列化 Stopwatch dePS = new Stopwatch(); for (int j = 0; j < count; j++) { dePS.Start(); DeSerialize(Newlist, Stream); dePS.Stop(); time2 += dePS.Elapsed.TotalMilliseconds; } Console.WriteLine("反序列化20次平均用时" + time2 / count); //测试反序列化输出 //Test.PrintDeSerialize(Newlist); } static void Serialize(MemoryStream ms, List<Person> list) { foreach (var obj in list) { SerializerHelper.Serializa<Person>(ms, obj); } } static void DeSerialize(List<Person> list,MemoryStream ms) { SerializerHelper.DeSerializa<Person>(list, ms); } } public class Person { public long Sno { get; set; } public string Name { get; set; } public int Age { get; set; } public DateTime NowTime { get; set; } public bool IsInShool { get; set; } public byte Country { get; set; } public decimal Language { get; set; } public double Professional { get; set; } public short Study { get; set; } public float FatherName { get; set; } public string MotherName { get; set; } }}
序列化和反序列化实现:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Reflection;namespace 用户自定义输入{ public class SerializerHelper { public static void Serializa<T>(MemoryStream ms, T obj) { BinaryWriter bw = new BinaryWriter(ms); PropertyInfo[] props = obj.GetType().GetProperties(); foreach (PropertyInfo property in props) { bw.Write(property.Name); switch (property.PropertyType.FullName) { case "System.String": bw.Write(Convert.ToString(property.GetValue(obj, null))); break; case "System.Int16": bw.Write(Convert.ToInt16(property.GetValue(obj, null))); break; case "System.Int32": bw.Write(Convert.ToInt32(property.GetValue(obj, null))); break; case "System.Int64": bw.Write(Convert.ToInt64(property.GetValue(obj, null))); break; case "System.Boolean": bw.Write(Convert.ToBoolean(property.GetValue(obj, null))); break; case "System.Byte": bw.Write(Convert.ToByte(property.GetValue(obj, null))); break; case "System.Decimal": bw.Write(Convert.ToDecimal(property.GetValue(obj, null))); break; case "System.Double": bw.Write(Convert.ToDouble(property.GetValue(obj, null))); break; case "System.SByte": bw.Write(Convert.ToSByte(property.GetValue(obj, null))); break; case "System.Single": bw.Write(Convert.ToSingle(property.GetValue(obj, null))); break; case "System.UInt16": bw.Write(Convert.ToUInt16(property.GetValue(obj, null))); break; case "System.UInt32": bw.Write(Convert.ToUInt32(property.GetValue(obj, null))); break; case "System.UInt64": bw.Write(Convert.ToUInt64(property.GetValue(obj, null))); break; case "System.DateTime": bw.Write(property.GetValue(obj, null).ToString()); break; } } } public static void DeSerializa<T>(List<T> list, MemoryStream ms) { ms.Seek(0, SeekOrigin.Begin); BinaryReader br = new BinaryReader(ms); PropertyInfo[] fields = typeof(T).GetProperties(); do { T obj = Activator.CreateInstance<T>(); foreach (PropertyInfo field in fields) { if (field.Name == br.ReadString()) { switch (field.PropertyType.FullName) { case "System.String": field.SetValue(obj, br.ReadString(), null); break; case "System.Int16": field.SetValue(obj, br.ReadInt16(), null); break; case "System.Int32": field.SetValue(obj, br.ReadInt32(), null); break; case "System.Int64": field.SetValue(obj, br.ReadInt64(), null); break; case "System.Boolean": field.SetValue(obj, br.ReadBoolean(), null); break; case "System.Byte": field.SetValue(obj, br.ReadByte(), null); break; case "System.Char": field.SetValue(obj, br.ReadChar(), null); break; case "System.Decimal": field.SetValue(obj, br.ReadDecimal(), null); break; case "System.Double": field.SetValue(obj, br.ReadDouble(), null); break; case "System.SByte": field.SetValue(obj, br.ReadSByte(), null); break; case "System.Single": field.SetValue(obj, br.ReadSingle(), null); break; case "System.UInt16": field.SetValue(obj, br.ReadUInt16(), null); break; case "System.UInt32": field.SetValue(obj, br.ReadInt32(), null); break; case "System.UInt64": field.SetValue(obj, br.ReadInt64(), null); break; case "System.DateTime": field.SetValue(obj, DateTime.Parse(br.ReadString()), null); break; } } } list.Add(obj); } while (br.PeekChar() != -1); } }}
测试程序
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Reflection;namespace 用户自定义输入{ class Test { //测试list<Person>是否已经被写入到MemoryStream public static void PrintStream(MemoryStream stream) { Console.WriteLine("测试list<Person>是否已经被写入到MemoryStream"); stream.Seek(0, SeekOrigin.Begin); BinaryReader Test = new BinaryReader(stream); for (int i = 0; i <= 100; i++) { Console.WriteLine(Test.ReadString()); } } //测试MemoryStream中的内容是否写入到新的list<Person> public static void PrintDeSerialize<T>(List<T> list) { foreach (T t in list) { Console.WriteLine("测试MemoryStream中的内容是否写入到Newlist<Person>"); PropertyInfo[] props = t.GetType().GetProperties(); foreach (PropertyInfo property in props) { Console.WriteLine(property.Name); Console.WriteLine(property.GetValue(t, null)); } } } }}
利用反射实现序列化和反序列化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。