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; } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。