2010-11-10 12 views
67

को क्रमबद्ध करने और deserialize करने का सबसे तेज़ तरीका। मैं .NET ऑब्जेक्ट्स को क्रमबद्ध और deserialize करने के लिए सबसे तेज़ तरीका ढूंढ रहा हूं।.NET ऑब्जेक्ट्स

public class TD 
{ 
    public List<CT> CTs { get; set; } 
    public List<TE> TEs { get; set; } 
    public string Code { get; set; } 
    public string Message { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 

    public static string Serialize(List<TD> tData) 
    { 
     var serializer = new XmlSerializer(typeof(List<TD>)); 

     TextWriter writer = new StringWriter(); 
     serializer.Serialize(writer, tData); 

     return writer.ToString(); 
    } 

    public static List<TD> Deserialize(string tData) 
    { 
     var serializer = new XmlSerializer(typeof(List<TD>)); 

     TextReader reader = new StringReader(tData); 

     return (List<TD>)serializer.Deserialize(reader); 
    }   
} 
+2

प्रदर्शन या कोड पैर प्रिंट? – ulrichb

+0

क्या आप मुझसे पूछ रहे हैं कि मुझे प्रदर्शन डेटा या कोड चाहिए? – aron

+3

वह पूछ रहा है कि, "सबसे तेज़ तरीका" से, आपका मतलब प्रदर्शन के संदर्भ में या कोड पदचिह्न के संदर्भ में है। कोड और कार्यान्वयन के मामले में 'बाइनरीफॉर्मेटर' बेहद तेज़ है, लेकिन मार्क की तरह एक समाधान बेंचमार्क में तेजी से प्रदर्शन करेगा। –

उत्तर

46

यहाँ अपने मॉडल (आविष्कार CT और TE के साथ) protobuf-net का उपयोग कर मैं नम्रतापूर्वक प्रस्तुत करता हूं (यदि आपको इसकी आवश्यकता है तो बहुत सारे साक्ष्य के साथ) कि है .NET में सबसे तेज़ (या निश्चित रूप से सबसे तेज़) सामान्य उद्देश्य serializer में से एक है।

यदि आपको स्ट्रिंग की आवश्यकता है, तो बेस -64 बाइनरी एन्कोड करें।

[XmlType] 
public class CT { 
    [XmlElement(Order = 1)] 
    public int Foo { get; set; } 
} 
[XmlType] 
public class TE { 
    [XmlElement(Order = 1)] 
    public int Bar { get; set; } 
} 
[XmlType] 
public class TD { 
    [XmlElement(Order=1)] 
    public List<CT> CTs { get; set; } 
    [XmlElement(Order=2)] 
    public List<TE> TEs { get; set; } 
    [XmlElement(Order = 3)] 
    public string Code { get; set; } 
    [XmlElement(Order = 4)] 
    public string Message { get; set; } 
    [XmlElement(Order = 5)] 
    public DateTime StartDate { get; set; } 
    [XmlElement(Order = 6)] 
    public DateTime EndDate { get; set; } 

    public static byte[] Serialize(List<TD> tData) { 
     using (var ms = new MemoryStream()) { 
      ProtoBuf.Serializer.Serialize(ms, tData); 
      return ms.ToArray(); 
     }    
    } 

    public static List<TD> Deserialize(byte[] tData) { 
     using (var ms = new MemoryStream(tData)) { 
      return ProtoBuf.Serializer.Deserialize<List<TD>>(ms); 
     } 
    } 
} 
+0

धन्यवाद – aron

+1

G'day मार्क के लिए धन्यवाद, आपके द्वारा किए गए प्रोटोकॉल-बफर काम से प्यार है और मुझे पता है कि यह पोस्ट लगभग 5 वर्ष पुराना है लेकिन यहां एक उत्तर में उद्धृत नेटस्टेरियलाइज़र (बिनोज) में आपके मीट्रिकेशन का संकेत नहीं है सबसे तेज़। क्या यह एक उचित बयान/विज्ञापन है या क्या कोई व्यापार बंद है? धन्यवाद –

+0

ठीक है अब मैं देखता हूं, NetSerialization केवल उसी संस्करण के लिए काम करता है जहां मैं संस्करण टोलरेंट सीरियलाइजेशन –

12

Protobuf बहुत बहुत तेजी से है: यहाँ क्या मैं अब तक है।

इस प्रणाली के प्रदर्शन से संबंधित गहराई से जानकारी के लिए http://code.google.com/p/protobuf-net/wiki/Performance देखें और एक कार्यान्वयन।

+0

प्रोटोबफ का उपयोग करने में कोई कमी है? –

+7

आपको अपनी ऑब्जेक्ट्स को एनोटेट करना होगा। प्रोटोबफ क्षेत्रीय नामों और प्रकारों को धारावाहिक के रूप में संग्रहीत नहीं करता है, लेकिन उन्हें अपने वास्तविक प्रकार से ले जाता है। लक्ष्य फ़ाइलों को बहुत छोटा होने के कारणों में से एक यह है। दस्तावेज यह सब बताता है। मैं इसे कुछ समय से उपयोग कर रहा हूं, और यदि आपको तेज़ (डी) क्रमबद्धता और छोटी लक्ष्य फ़ाइलों की आवश्यकता है, तो प्रोटोबफ वास्तव में जाने का तरीका है। –

+0

उत्तर में जोड़ने के लिए प्रोटोबट में प्रोटोबट का उपयोग कर कोई भी पूर्ण स्रोत कोड नमूना? – Kiquenet

3

.net के साथ शामिल बाइनरी सीरिएलाइज़र तेज होना चाहिए जो XmlSerializer है। या प्रोटोबफ, जेसन, के लिए एक और धारावाहिक ...

लेकिन उनमें से कुछ के लिए आपको मेटाडेटा जोड़ने के लिए विशेषताओं, या किसी अन्य तरीके को जोड़ने की आवश्यकता है। उदाहरण के लिए प्रोटोबफ आंतरिक रूप से संख्यात्मक संपत्ति आईडी का उपयोग करता है, और मैपिंग को किसी भी तरह से एक अलग तंत्र द्वारा संरक्षित किया जाना चाहिए। संस्करण किसी भी धारावाहिक के साथ तुच्छ नहीं है। ; - (माइग्रेशन के लिए विशेष रूप से अभी तक XmlSerializer उपयोग करने की क्षमता को बनाए रखना है, जो उपयोगी हो सकता है)

+0

हां, यह वास्तव में बहुत तेज़ है, और यह एक्सएमएल की तुलना में बहुत अधिक मामलों/प्रकारों को संभालता है। – leppie

21

एक comprehansive पोस्ट enter image description here

+2

की तलाश में हूं, यह गति नहीं है। वह धीमा है। यह लेखित लेख में "छोटा बेहतर है" कहता है। –

+1

@TimurNuriyasov, उस समय ऑपरेशन – Maxim

+2

करने के लिए लिया गया है तो आप कहते हैं कि बाइनरी सबसे धीमी है? मुझे ऐसा नहीं लगता! मुझे लगता है कि यह सही ढंग से गति को संदर्भित करता है, समय नहीं। – Javid

10

फिर भी एक और वहाँ बाहर serializer सुपर तेजी से होने का दावा करता है कि इस पोस्ट http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/

बस एक नमूने में diffreent मेरे द्वारा प्रारूपों के बीच तुलना netserializer है।

अपनी साइट पर दिए गए आंकड़ों Protobuf से अधिक 2x के प्रदर्शन से पता चलता है, मैं इस अपने आप को प्रयास नहीं किया है, लेकिन अगर आप विभिन्न विकल्पों का मूल्यांकन कर रहे, इस रूप में अच्छी तरह

कोशिश
+2

मैंने अभी अपने आवेदन में नेटसेरियलाइज़र की कोशिश की और यह आश्चर्यजनक काम करता है। यह एक कोशिश के योग्य है। – Galen

0

आप Salar.Bois serializer जो एक सभ्य प्रदर्शन की कोशिश कर सकते । इसका ध्यान पेलोड आकार पर है लेकिन यह भी अच्छा प्रदर्शन प्रदान करता है।

यदि आप अपने आप परिणामों को देखना और तुलना करना चाहते हैं तो गितब पेज में मानक हैं।

https://github.com/salarcode/Bois

0

मैं CGbR generator में अपनी कक्षाओं खिला की स्वतंत्रता ले लिया। क्योंकि यह शुरुआती चरण में है, यह अभी तक DateTime का समर्थन नहीं करता है, इसलिए मैंने इसे लंबे समय से बदल दिया। उत्पन्न क्रमबद्धता कोड इस तरह दिखता है:

public int Size 
{ 
    get 
    { 
     var size = 24; 
     // Add size for collections and strings 
     size += Cts == null ? 0 : Cts.Count * 4; 
     size += Tes == null ? 0 : Tes.Count * 4; 
     size += Code == null ? 0 : Code.Length; 
     size += Message == null ? 0 : Message.Length; 

     return size;    
    } 
} 

public byte[] ToBytes(byte[] bytes, ref int index) 
{ 
    if (index + Size > bytes.Length) 
     throw new ArgumentOutOfRangeException("index", "Object does not fit in array"); 

    // Convert Cts 
    // Two bytes length information for each dimension 
    GeneratorByteConverter.Include((ushort)(Cts == null ? 0 : Cts.Count), bytes, ref index); 
    if (Cts != null) 
    { 
     for(var i = 0; i < Cts.Count; i++) 
     { 
      var value = Cts[i]; 
      value.ToBytes(bytes, ref index); 
     } 
    } 
    // Convert Tes 
    // Two bytes length information for each dimension 
    GeneratorByteConverter.Include((ushort)(Tes == null ? 0 : Tes.Count), bytes, ref index); 
    if (Tes != null) 
    { 
     for(var i = 0; i < Tes.Count; i++) 
     { 
      var value = Tes[i]; 
      value.ToBytes(bytes, ref index); 
     } 
    } 
    // Convert Code 
    GeneratorByteConverter.Include(Code, bytes, ref index); 
    // Convert Message 
    GeneratorByteConverter.Include(Message, bytes, ref index); 
    // Convert StartDate 
    GeneratorByteConverter.Include(StartDate.ToBinary(), bytes, ref index); 
    // Convert EndDate 
    GeneratorByteConverter.Include(EndDate.ToBinary(), bytes, ref index); 
    return bytes; 
} 

public Td FromBytes(byte[] bytes, ref int index) 
{ 
    // Read Cts 
    var ctsLength = GeneratorByteConverter.ToUInt16(bytes, ref index); 
    var tempCts = new List<Ct>(ctsLength); 
    for (var i = 0; i < ctsLength; i++) 
    { 
     var value = new Ct().FromBytes(bytes, ref index); 
     tempCts.Add(value); 
    } 
    Cts = tempCts; 
    // Read Tes 
    var tesLength = GeneratorByteConverter.ToUInt16(bytes, ref index); 
    var tempTes = new List<Te>(tesLength); 
    for (var i = 0; i < tesLength; i++) 
    { 
     var value = new Te().FromBytes(bytes, ref index); 
     tempTes.Add(value); 
    } 
    Tes = tempTes; 
    // Read Code 
    Code = GeneratorByteConverter.GetString(bytes, ref index); 
    // Read Message 
    Message = GeneratorByteConverter.GetString(bytes, ref index); 
    // Read StartDate 
    StartDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(bytes, ref index)); 
    // Read EndDate 
    EndDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(bytes, ref index)); 

    return this; 
} 

मैं इस तरह नमूना वस्तुओं की एक सूची बनाई गई:

var objects = new List<Td>(); 
for (int i = 0; i < 1000; i++) 
{ 
    var obj = new Td 
    { 
     Message = "Hello my friend", 
     Code = "Some code that can be put here", 
     StartDate = DateTime.Now.AddDays(-7), 
     EndDate = DateTime.Now.AddDays(2), 
     Cts = new List<Ct>(), 
     Tes = new List<Te>() 
    }; 
    for (int j = 0; j < 10; j++) 
    { 
     obj.Cts.Add(new Ct { Foo = i * j }); 
     obj.Tes.Add(new Te { Bar = i + j }); 
    } 
    objects.Add(obj); 
} 

Release निर्माण में मेरी मशीन पर परिणाम:

var watch = new Stopwatch(); 
watch.Start(); 
var bytes = BinarySerializer.SerializeMany(objects); 
watch.Stop(); 

आकार : 14 9 000 बाइट

समय: 2.059ms 3.13ms

संपादित करें: CGbR के साथ शुरू 0.4.3 द्विआधारी serializer दिनांक समय का समर्थन करता है। दुर्भाग्य से DateTime.ToBinary विधि बहुत धीमी है। मैं जल्द ही इसे जल्दी से कुछ हद तक बदल दूंगा।

EDIT2: यूटीसी DateTime का उपयोग करते समय 1.669ms पर में ToUniversalTime() प्रदर्शन पुनर्स्थापित किया जाता है और घड़ियों लागू द्वारा।

8

इसमें रूचि रखने के बाद, मैंने सुझाए गए तरीकों का परीक्षण करने के लिए निकटतम "सेब सेब" परीक्षण के साथ परीक्षण करने का निर्णय लिया। मैंने निम्नलिखित कोड के साथ एक कंसोल ऐप लिखा:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Text; 
using System.Threading.Tasks; 

namespace SerializationTests 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var count = 100000; 
      var rnd = new Random(DateTime.UtcNow.GetHashCode()); 
      Console.WriteLine("Generating {0} arrays of data...", count); 
      var arrays = new List<int[]>(); 
      for (int i = 0; i < count; i++) 
      { 
       var elements = rnd.Next(1, 100); 
       var array = new int[elements]; 
       for (int j = 0; j < elements; j++) 
       { 
        array[j] = rnd.Next(); 
       } 
       arrays.Add(array); 
      } 
      Console.WriteLine("Test data generated."); 
      var stopWatch = new Stopwatch(); 

      Console.WriteLine("Testing BinarySerializer..."); 
      var binarySerializer = new BinarySerializer(); 
      var binarySerialized = new List<byte[]>(); 
      var binaryDeserialized = new List<int[]>(); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var array in arrays) 
      { 
       binarySerialized.Add(binarySerializer.Serialize(array)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("BinaryFormatter: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var serialized in binarySerialized) 
      { 
       binaryDeserialized.Add(binarySerializer.Deserialize<int[]>(serialized)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("BinaryFormatter: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 


      Console.WriteLine(); 
      Console.WriteLine("Testing ProtoBuf serializer..."); 
      var protobufSerializer = new ProtoBufSerializer(); 
      var protobufSerialized = new List<byte[]>(); 
      var protobufDeserialized = new List<int[]>(); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var array in arrays) 
      { 
       protobufSerialized.Add(protobufSerializer.Serialize(array)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("ProtoBuf: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var serialized in protobufSerialized) 
      { 
       protobufDeserialized.Add(protobufSerializer.Deserialize<int[]>(serialized)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("ProtoBuf: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      Console.WriteLine(); 
      Console.WriteLine("Testing NetSerializer serializer..."); 
      var netSerializerSerializer = new ProtoBufSerializer(); 
      var netSerializerSerialized = new List<byte[]>(); 
      var netSerializerDeserialized = new List<int[]>(); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var array in arrays) 
      { 
       netSerializerSerialized.Add(netSerializerSerializer.Serialize(array)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("NetSerializer: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var serialized in netSerializerSerialized) 
      { 
       netSerializerDeserialized.Add(netSerializerSerializer.Deserialize<int[]>(serialized)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("NetSerializer: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      Console.WriteLine("Press any key to end."); 
      Console.ReadKey(); 
     } 

     public class BinarySerializer 
     { 
      private static readonly BinaryFormatter Formatter = new BinaryFormatter(); 

      public byte[] Serialize(object toSerialize) 
      { 
       using (var stream = new MemoryStream()) 
       { 
        Formatter.Serialize(stream, toSerialize); 
        return stream.ToArray(); 
       } 
      } 

      public T Deserialize<T>(byte[] serialized) 
      { 
       using (var stream = new MemoryStream(serialized)) 
       { 
        var result = (T)Formatter.Deserialize(stream); 
        return result; 
       } 
      } 
     } 

     public class ProtoBufSerializer 
     { 
      public byte[] Serialize(object toSerialize) 
      { 
       using (var stream = new MemoryStream()) 
       { 
        ProtoBuf.Serializer.Serialize(stream, toSerialize); 
        return stream.ToArray(); 
       } 
      } 

      public T Deserialize<T>(byte[] serialized) 
      { 
       using (var stream = new MemoryStream(serialized)) 
       { 
        var result = ProtoBuf.Serializer.Deserialize<T>(stream); 
        return result; 
       } 
      } 
     } 

     public class NetSerializer 
     { 
      private static readonly NetSerializer Serializer = new NetSerializer(); 
      public byte[] Serialize(object toSerialize) 
      { 
       return Serializer.Serialize(toSerialize); 
      } 

      public T Deserialize<T>(byte[] serialized) 
      { 
       return Serializer.Deserialize<T>(serialized); 
      } 
     } 
    } 
} 

परिणाम मुझे आश्चर्यचकित कर दिया; जब अनेक बार चलाने वे निरंतर चल रहे थे:

Generating 100000 arrays of data... 
Test data generated. 
Testing BinarySerializer... 
BinaryFormatter: Serializing took 336.8392ms. 
BinaryFormatter: Deserializing took 208.7527ms. 

Testing ProtoBuf serializer... 
ProtoBuf: Serializing took 2284.3827ms. 
ProtoBuf: Deserializing took 2201.8072ms. 

Testing NetSerializer serializer... 
NetSerializer: Serializing took 2139.5424ms. 
NetSerializer: Deserializing took 2113.7296ms. 
Press any key to end. 

इन परिणामों का संग्रह, मैं देखने के लिए अगर Protobuf या NetSerializer बड़ा वस्तुओं के साथ बेहतर प्रदर्शन किया फैसला किया। मैंने संग्रह की गणना 10,000 वस्तुओं तक बदल दी, लेकिन 1-100 के बजाय सरणी के आकार को 1-10,000 तक बढ़ा दिया। परिणाम और भी अधिक निश्चित लग रहा था:

Generating 10000 arrays of data... 
Test data generated. 
Testing BinarySerializer... 
BinaryFormatter: Serializing took 285.8356ms. 
BinaryFormatter: Deserializing took 206.0906ms. 

Testing ProtoBuf serializer... 
ProtoBuf: Serializing took 10693.3848ms. 
ProtoBuf: Deserializing took 5988.5993ms. 

Testing NetSerializer serializer... 
NetSerializer: Serializing took 9017.5785ms. 
NetSerializer: Deserializing took 5978.7203ms. 
Press any key to end. 

मेरा निष्कर्ष है, इसलिए, यह है: वहाँ मामलों में जहां Protobuf और NetSerializer को अच्छी तरह से अनुकूल हैं हो सकता है, लेकिन कम से कम अपेक्षाकृत सरल वस्तुओं के लिए कच्चे प्रदर्शन के मामले में ... बाइनरीफॉर्मेटर कम से कम परिमाण के क्रम से काफी अधिक प्रदर्शनकारी है।

वाईएमएमवी।

+0

शायद बाइनरीफॉर्मेटर सरणी के साथ वास्तव में तेज़ है। – Behrooz

+2

यह संभव है ... लेकिन उल्लिखित शर्तों के तहत, परिणाम नाटकीय थे। यहां सबक सिर्फ हो सकता है, विश्वास नहीं है कि सभी परिस्थितियों में एक विधि सबसे अधिक प्रदर्शनकारी है। परीक्षण और बेंचमार्किंग हमेशा प्रबुद्ध होता है। –

0

मैंने उपरोक्त कोड में बग को हटा दिया और परिणाम नीचे दिए गए: मुझे यह भी अनिश्चितता है कि NetSerializer आपको उन प्रकारों को पंजीकृत करने की आवश्यकता है, जिन्हें आप क्रमबद्ध कर रहे हैं, किस तरह की संगतता या प्रदर्शन अंतर जो संभवतः बना सकते हैं।

Generating 100000 arrays of data... 
Test data generated. 
Testing BinarySerializer... 
BinaryFormatter: Serializing took 508.9773ms. 
BinaryFormatter: Deserializing took 371.8499ms. 

Testing ProtoBuf serializer... 
ProtoBuf: Serializing took 3280.9185ms. 
ProtoBuf: Deserializing took 3190.7899ms. 

Testing NetSerializer serializer... 
NetSerializer: Serializing took 427.1241ms. 
NetSerializer: Deserializing took 78.954ms. 
Press any key to end. 

संशोधित कोड

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Text; 
using System.Threading.Tasks; 

namespace SerializationTests 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var count = 100000; 
      var rnd = new Random((int)DateTime.UtcNow.Ticks & 0xFF); 
      Console.WriteLine("Generating {0} arrays of data...", count); 
      var arrays = new List<int[]>(); 
      for (int i = 0; i < count; i++) 
      { 
       var elements = rnd.Next(1, 100); 
       var array = new int[elements]; 
       for (int j = 0; j < elements; j++) 
       { 
        array[j] = rnd.Next(); 
       } 
       arrays.Add(array); 
      } 
      Console.WriteLine("Test data generated."); 
      var stopWatch = new Stopwatch(); 

      Console.WriteLine("Testing BinarySerializer..."); 
      var binarySerializer = new BinarySerializer(); 
      var binarySerialized = new List<byte[]>(); 
      var binaryDeserialized = new List<int[]>(); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var array in arrays) 
      { 
       binarySerialized.Add(binarySerializer.Serialize(array)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("BinaryFormatter: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var serialized in binarySerialized) 
      { 
       binaryDeserialized.Add(binarySerializer.Deserialize<int[]>(serialized)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("BinaryFormatter: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 


      Console.WriteLine(); 
      Console.WriteLine("Testing ProtoBuf serializer..."); 
      var protobufSerializer = new ProtoBufSerializer(); 
      var protobufSerialized = new List<byte[]>(); 
      var protobufDeserialized = new List<int[]>(); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var array in arrays) 
      { 
       protobufSerialized.Add(protobufSerializer.Serialize(array)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("ProtoBuf: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var serialized in protobufSerialized) 
      { 
       protobufDeserialized.Add(protobufSerializer.Deserialize<int[]>(serialized)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("ProtoBuf: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      Console.WriteLine(); 
      Console.WriteLine("Testing NetSerializer serializer..."); 
      var netSerializerSerialized = new List<byte[]>(); 
      var netSerializerDeserialized = new List<int[]>(); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      var netSerializerSerializer = new NS(); 
      foreach (var array in arrays) 
      { 
       netSerializerSerialized.Add(netSerializerSerializer.Serialize(array)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("NetSerializer: Serializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      stopWatch.Reset(); 
      stopWatch.Start(); 
      foreach (var serialized in netSerializerSerialized) 
      { 
       netSerializerDeserialized.Add(netSerializerSerializer.Deserialize<int[]>(serialized)); 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("NetSerializer: Deserializing took {0}ms.", stopWatch.Elapsed.TotalMilliseconds); 

      Console.WriteLine("Press any key to end."); 
      Console.ReadKey(); 
     } 

     public class BinarySerializer 
     { 
      private static readonly BinaryFormatter Formatter = new BinaryFormatter(); 

      public byte[] Serialize(object toSerialize) 
      { 
       using (var stream = new MemoryStream()) 
       { 
        Formatter.Serialize(stream, toSerialize); 
        return stream.ToArray(); 
       } 
      } 

      public T Deserialize<T>(byte[] serialized) 
      { 
       using (var stream = new MemoryStream(serialized)) 
       { 
        var result = (T)Formatter.Deserialize(stream); 
        return result; 
       } 
      } 
     } 

     public class ProtoBufSerializer 
     { 
      public byte[] Serialize(object toSerialize) 
      { 
       using (var stream = new MemoryStream()) 
       { 
        ProtoBuf.Serializer.Serialize(stream, toSerialize); 
        return stream.ToArray(); 
       } 
      } 

      public T Deserialize<T>(byte[] serialized) 
      { 
       using (var stream = new MemoryStream(serialized)) 
       { 
        var result = ProtoBuf.Serializer.Deserialize<T>(stream); 
        return result; 
       } 
      } 
     } 

     public class NS 
     { 
      NetSerializer.Serializer Serializer = new NetSerializer.Serializer(new Type[] { typeof(int), typeof(int[]) }); 

      public byte[] Serialize(object toSerialize) 
      { 
       using (var stream = new MemoryStream()) 
       { 
        Serializer.Serialize(stream, toSerialize); 
        return stream.ToArray(); 
       } 
      } 

      public T Deserialize<T>(byte[] serialized) 
      { 
       using (var stream = new MemoryStream(serialized)) 
       { 
        Serializer.Deserialize(stream, out var result); 
        return (T)result; 
       } 
      } 
     } 
    } 
} 
संबंधित मुद्दे