首页 > 代码库 > 三种序列化方式性能比较

三种序列化方式性能比较

一下代码比较了二进制序列化、xml序列化、Protobuf序列化的运行时间,可是代码显得十分冗余,是否有大神可以指点一二,万分感谢

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;namespace ProtoBuf{    class Program    {        static void Main(string[] args)        {            List<Person> list = new List<Person>();            int count = 100;            double SumTs1 = 0, SumTs2 = 0,SumTs3=0,SumTs4=0,SumTs5=0,SumTs6=0;            for (var i=0;i<1000;i++)            {                var person = new Person                {                    Sno = i,                    Name = "Name" + i,                    Age = 20 + i,                    HomeTown="HomeTown"+i,                    Shool="Shool"+i,                    Country="Country"+i,                    Language="Language"+i,                    Professional="professional"+i,                    Study="study"+i,                    FatherName="fatherName"+i,                    MotherName="motherName"+i                };                list.Add(person);            }            do            {                //binary序列化开始                DateTime binaryTime1 = System.DateTime.Now;                BinaryFormatter bf = new BinaryFormatter();                Stream BinaryStream = new FileStream("e:/person.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);                //Stream BinaryStream = new MemoryStream();                bf.Serialize(BinaryStream, list);                BinaryStream.Close();                DateTime binaryTime2 = System.DateTime.Now;                //binary反序列化开始                DateTime debinaryTime1 = System.DateTime.Now;                Stream deBinaryStream = new FileStream("e:/person.txt", FileMode.Open, FileAccess.Read, FileShare.Read);                //Stream deBinaryStream = new MemoryStream();                object obj =bf.Deserialize(BinaryStream);                deBinaryStream.Close();                DateTime debinaryTime2 = System.DateTime.Now;                //Xml序列化开始                DateTime XmlTime1 = System.DateTime.Now;                XmlSerializer xs = new XmlSerializer(typeof(List<Person>));                Stream XmlStream = new FileStream("e:/2person.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);                xs.Serialize(XmlStream, list);                XmlStream.Close();                DateTime XmlTime2 = System.DateTime.Now;                //Xml反序列化开始                DateTime deXmlTime1 = System.DateTime.Now;                XmlSerializer dexs = new XmlSerializer(typeof(List<Person>));                Stream deXmlStream = new FileStream("e:/2person.txt", FileMode.Open, FileAccess.Read, FileShare.Read);                //Stream deXmlStream = new MemoryStream();                List<Person> list2 = (List<Person>)dexs.Deserialize(deXmlStream);                deXmlStream.Close();                DateTime deXmlTime2 = System.DateTime.Now;                //ProtoBuf序列化开始                DateTime ProtoBufTime1 = System.DateTime.Now;                Stream ProtoBufStream = new MemoryStream();                ProtoBuf.Serializer.Serialize(ProtoBufStream, list);                ProtoBufStream.Close();                DateTime ProtoBufTime2 = System.DateTime.Now;                //ProtoBuf反序列化开始                DateTime deProtoBufTime1 = System.DateTime.Now;                Stream deProtoBufStream = new MemoryStream();                Person newPerson = ProtoBuf.Serializer.Deserialize<Person>(deProtoBufStream);                deProtoBufStream.Close();                DateTime deProtoBufTime2 = System.DateTime.Now;                //计算时间和运行次数                SumTs1 += binaryTime2.Subtract(binaryTime1).TotalMilliseconds;                SumTs2 += debinaryTime2.Subtract(debinaryTime1).TotalMilliseconds;                SumTs3 += XmlTime2.Subtract(XmlTime1).TotalMilliseconds;                SumTs4 += deXmlTime2.Subtract(deXmlTime1).TotalMilliseconds;                SumTs5 += ProtoBufTime2.Subtract(ProtoBufTime1).TotalMilliseconds;                SumTs6 += deProtoBufTime2.Subtract(deProtoBufTime1).TotalMilliseconds;                count--;            } while (count > 0);            Console.WriteLine("*********************************序列化比较结果************************************");            Console.WriteLine("***            binary序列化        Xml序列化         ProtoBuf序列化        ");            Console.WriteLine("***序列化      "+SumTs1/100+"           "+SumTs3/100+"          "+SumTs5/100);            Console.WriteLine("***反序列化    "+SumTs2/100+"             "+SumTs4/100+"         "+SumTs6/100);            Console.WriteLine("**********************************************************************************");        }    }    [ProtoBuf.ProtoContract]    [Serializable]    public class Person    {        public int Sno { get; set; }        public string Name { get; set; }        public int Age { get; set; }        public string HomeTown { get; set; }        public string Shool { get; set; }        public string Country{get;set;}        public string Language{get;set;}        public string Professional{get;set;}        public string Study{get;set;}        public string FatherName{get;set;}        public string MotherName{get;set;}    }   }

 

三种序列化方式性能比较