zoukankan      html  css  js  c++  java
  • Protobuf-net实现序列化

    引入Protobuf-net的dll,

    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 int testCount = 100;
            static void Main(string[] args)
            {
                var list = InitData();
                TestProtoBufSerialize(list);
                //TestDeProtoBufSerialize(list);
                //TestBinarySerialize(list);
                //TestDeBinarySerialize(list);
    
                Console.Read();
            }
    
            private static List<Person> InitData()
            {
                List<Person> list = new List<Person>();
                for (var i = 0; i < 1024*100; 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);
                }
                return list;
            }
    
            static void TestProtoBufSerialize(List<Person> list)
            {
    
    
                Stopwatch NPS = new Stopwatch();
                NPS.Start();
                Stream stream = new MemoryStream();
                for (int i = 0; i < testCount; i++)
                {
                    ProtobufSerializa2(list, stream);
                }
                NPS.Stop();
                Console.WriteLine("一次内存流" + NPS.Elapsed.TotalMilliseconds);
    
                Stopwatch PS = new Stopwatch();
                PS.Start();
                for (int i = 0; i < testCount; i++)
                {
                    ProtobufSerializa(list);
                }
                PS.Stop();
                Console.WriteLine("原方法" + PS.Elapsed.TotalMilliseconds);
    
                Stopwatch NPSs = new Stopwatch();
                NPSs.Start();
                for (int i = 0; i < testCount; i++)
                {
                    ProtobufSerializa3(list);
                }
                NPSs.Stop();
                Console.WriteLine("改进方法" + NPSs.Elapsed.TotalMilliseconds);
            }
    
            //static void TestDeProtoBufSerialize(List<Person> list)
            //{
            //    Stopwatch NePS = new Stopwatch();
            //    NePS.Start();
            //    for (int i = 0; i < testCount; i++)
            //    {
            //        deProtobufSerializa3(list);
            //    }
            //    NePS.Stop();
            //    Console.WriteLine("反序列化方法3用时" + NePS.Elapsed.TotalMilliseconds);
           
            //    Stopwatch NdePS = new Stopwatch();
            //    NdePS.Start();
            //    for (int i = 0; i < testCount; i++)
            //    {
            //        deProtobufSerializa2(list);
            //    }
            //    NdePS.Stop();
            //    Console.WriteLine("反序列化方法2用时" + NdePS.Elapsed.TotalMilliseconds);
    
            //    Stopwatch dePS = new Stopwatch();
            //    dePS.Start();
            //    for (int i = 0; i < testCount; i++)
            //    {
            //        deProtobufSerializa(list);
            //    }
            //    dePS.Stop();
            //    Console.WriteLine("反序列化方法1用时" + dePS.Elapsed.TotalMilliseconds);
            //}
    
            //static void TestBinarySerialize(List<Person> list)
            //{
            //    Stopwatch bsTime = new Stopwatch();
            //    bsTime.Start();
            //    for (int i = 0; i < testCount; i++)
            //    {
            //        BinarySerializa(list);
            //    }
            //    bsTime.Stop();
            //    Console.WriteLine("二进制序列化用时" + bsTime.Elapsed.TotalMilliseconds);
    
            //}
    
            //static void TestDeBinarySerialize(List<Person> list)
            //{
            //    Stopwatch debsTime = new Stopwatch();
            //    debsTime.Start();
            //    for (int i = 0; i < testCount; i++)
            //    {
            //        deBinarySerializa(list);
            //    }
            //    debsTime.Stop();
            //    Console.WriteLine("二进制序列化用时" + debsTime.Elapsed.TotalMilliseconds);
    
            //}
           
    
            //原方法
            static void ProtobufSerializa(List<Person> list)
            {
                Stream ProtoBufStream = new MemoryStream();
                ProtoBuf.Serializer.Serialize(ProtoBufStream, list);
                //Console.WriteLine(ProtoBufStream.Position);
                //Console.WriteLine(ProtoBufStream.Length);
                ProtoBufStream.Close();
                ProtoBufStream.Dispose();
            }
    
            //仅计算一次内存流创建
            static void ProtobufSerializa2(List<Person> list, Stream ProtoBufStream)
            {
                ProtoBuf.Serializer.Serialize(ProtoBufStream, list);
            }
    
    
            //计算是否有内存流再考虑是否创建
            static void ProtobufSerializa3(List<Person> list)
            {
                var stream = MemoryStreamPool.AcquireMemoryStream();
                ProtoBuf.Serializer.Serialize(stream, list);
                MemoryStreamPool.Return(stream);
            }
    
            //static void BinarySerializa(List<Person> list)
            //{
            //    BinaryFormatter bf = new BinaryFormatter();
            //    Stream BinaryStream = new FileStream("e:/person.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
            //    bf.Serialize(BinaryStream, list);
            //    BinaryStream.Close();
            //}
    
            //static void deProtobufSerializa(List<Person> list)
            //{
            //    Stream deProtoBufStream = new MemoryStream();
            //    Person newPerson = ProtoBuf.Serializer.Deserialize<Person>(deProtoBufStream);
            //    deProtoBufStream.Close();
            //}
    
            //static void deProtobufSerializa2(List<Person> list)
            //{
            //    var stream = MemoryStreamPool.AcquireMemoryStream();
            //    Person newPerson = ProtoBuf.Serializer.Deserialize<Person>(stream);
            //    //MemoryStreamPool.Return(stream);
            //}
    
            //static void deProtobufSerializa3(List<Person> list)
            //{
            //    var stream = MemoryStreamPool.AcquireMemoryStream();
            //    Person newPerson = ProtoBuf.Serializer.Deserialize<Person>(stream);
            //    //MemoryStreamPool.Return(stream);
            //}
    
            //static void deBinarySerializa(List<Person> list)
            //{
            //    BinaryFormatter bf = new BinaryFormatter();
            //    Stream deBinaryStream = new FileStream("e:/person.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
            //    object obj = bf.Deserialize(deBinaryStream);
            //    deBinaryStream.Close();
            //}
    
            //static void Serializa(List<Person> list, int method)
            //{
            //    if (method == 1)
            //    {
            //        BinarySerializa(list);
            //    }
            //    else
            //    {
            //        throw new NotSupportedException();
            //    }
            //}
    
            //static void TestSerializa(List<Person> list, int method)
            //{
            //    Stopwatch stopwatch = Stopwatch.StartNew();
    
            //    for (int i = 0; i < testCount; i++)
            //    {
            //        Serializa(list, method);
            //    }
    
            //    stopwatch.Stop();
    
            //    Console.WriteLine("method:{0} time cost {1}ms", method, stopwatch.ElapsedMilliseconds);
            //}
    
            //static void Test(List<Person> list)
            //{
            //    int count = 100;
            //    double SumTs1 = 0, SumTs2 = 0, SumTs3 = 0, SumTs4 = 0, SumTs5 = 0, SumTs6 = 0;
            //    do
            //    {
            //        //binary序列化开始
            //        DateTime binaryTime1 = System.DateTime.Now;
            //        BinaryFormatter bf = new BinaryFormatter();
            //        Stream BinaryStream = new FileStream("e:/person.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
            //        //Stream BinaryStream = new MemoryStream();
            //        bf.Serialize(BinaryStream, list);
            //        //byte[] b = new byte[BinaryStream.Length];
            //        //BinaryStream.Position = 0;
            //        //BinaryStream.Read(b, 0, b.Length);
            //        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(deBinaryStream);
            //        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);
            //        //Stream XmlStream = new MemoryStream();
            //        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("**********************************************************************************");
            //}
    
        }
    
        public class MemoryStreamPool
        {
            //Stopwatch s = new Stopwatch();
    
            static MemoryStream instance;
            public static MemoryStream AcquireMemoryStream()
            {
                if (instance == null)
                {
                    instance = new MemoryStream();
                }
    
                return instance;
            }
    
            public static void Return(MemoryStream stream)
            {
                instance.Flush();
            }
        }
    
        [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; }
        }
    
    
    
    
    
    
    }
    
  • 相关阅读:
    docker学习笔记(一)-vagrant/docker machine安装docker,阿里云通过docker machine安装docker
    docker安装 centos7
    Robot Framework user guide
    Powershell 备忘
    如何在linux系统内用openssl 生成 过期的证书
    同时装了Python3和Python2,怎么用pip?
    python 基础笔记三
    python 基础笔记二
    python对文件的操作
    3-4 字典的嵌套
  • 原文地址:https://www.cnblogs.com/Freedom0619/p/4128281.html
Copyright © 2011-2022 走看看