利用反射实现序列化和反序列化

主程序

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));
                }
            }
        }
    }
}

  

时间: 2024-10-05 12:43:38

利用反射实现序列化和反序列化的相关文章

利用php的序列化和反序列化来做简单的数据本地存储

如下程序可以做为一个工具类 /** * 利用php的序列化和反序列化来做简单的数据本地存储 */ class objectdb { private static $db; //成功返回 objectdb 对象,不需要在外面使用new //目录需要写文件的权限 public function defaultdb($dbname='./default.db') { self::$db = $dbname; if(file_exists($dbname)) { return new objectdb(

项目之——利用json实现序列化与反序列化

comm目录下的另外几个文件 使用了开源的库jsoncpp,可下载. (1)my_json.h   1 #include<iostream>   2 #include<unistd.h>   3 #include<string>   4 #include "json/json.h"   5    6 class my_json   7 {   8 public:   9     my_json();  10     ~my_json();  11  

利用 进行Json对象的序列化和反序列化 - RJ - 博客园

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 - RJ - 博客园 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 进行Json对象的序列化和反序列化 - RJ - 博客园,bubuko.com" href="http://www.bubuko.com/infodetail-217182.html" target=_blank>利用 进行Json对象的序列化和反序列

利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScriptSerializer进行JSON序列化 注意:    是复杂对象. JSON是Javascript中常用的数据格

【Java基础】序列化与反序列化深入分析

一.前言 复习Java基础知识点的序列化与反序列化过程,整理了如下学习笔记. 二.为什么需要序列化与反序列化 程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终止,那么对象是肯定不会存在的,但是有时候,我们需要再程序终止时保存对象的状态信息,之后程序再次运行时可以重新恢复到之前的状态,如,玩家玩游戏退出时,需要保存玩家的状态信息(如等级.装备等等),之后玩家再此登入时,必须要恢复这些状态信息.我们可以通过数据库手段来达到这个保存状态的目的,在Java中,我

概述反射和序列化

1.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.在另一端,反序列化将从该流重新构造对象. 2.什么是SOAP,有哪些应用? 答:SOAP(Simple

序列化和反序列化[转]

http://tech.meituan.com/serialization_vs_deserialization.html #摘要序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中:另一方面,它们会以其他更容易理解的概念出现,例如加密.持久化.然而,序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式.大数据量系统设计里面更为显著.恰当的序列化协议不仅可以提高系统的通用性.强健性.安全性.优化系统性

序列化和反序列化-刘丁

#一.定义以及相关概念 互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分.通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同,例如:TCP/IP协议是一个四层协议,而OSI模型却是七层协议模型.在OSI七层协议模型中展现层(Presentation Layer)的主要功能是把应用层的对象转换成一段连续的二进制串,或者反过来,把二进制串转换成应用层的对象--这两个功能就是序列化和反序列化. 一般而言,TCP/IP协议的应用层对

第一节:序列化和反序列化快速入门

static void Main(string[] args) { var objectGraph = new List<string> { "Jeff", "Kristin", "Aidan", "Grant" }; Stream stream = SerializerToMemory(objectGraph); //为了演示,将一切都重置 stream.Position = 0; objectGraph = n