protobuf-net NOT faster than binary serialization?

Posted by Ashish Gupta on Stack Overflow See other posts from Stack Overflow or by Ashish Gupta
Published on 2010-06-03T13:42:33Z Indexed on 2010/06/03 13:44 UTC
Read the original article Hit count: 279

Filed under:
|

I wrote a program to serialize a 'Person' class using XMLSerializer, BinaryFormatter and ProtoBuf. I thought protobuf-net should be faster than the other two. Protobuf serialization was faster than XMLSerialization but much slower than the binary serialization. Is my understanding incorrect? Please make me understand this. Thank you for the help.

Following is the output:-

Person got created using protocol buffer in 347 milliseconds

Person got created using XML in 1462 milliseconds

Person got created using binary in 2 milliseconds

Code below

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProtoBuf;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
namespace ProtocolBuffers
{
    class Program
    {
        static void Main(string[] args)
        {
            string XMLSerializedFileName = "PersonXMLSerialized.xml";
            string ProtocolBufferFileName =  "PersonProtocalBuffer.bin";
            string BinarySerializedFileName = "PersonBinary.bin";

            var person = new Person { 
             Id = 12345, Name = "Fred", 
            Address = new Address { 
            Line1 = "Flat 1", 
            Line2 = "The Meadows" 
            }
            };

            Stopwatch watch = Stopwatch.StartNew();
            watch.Start();
            using (var file = File.Create(ProtocolBufferFileName))
            { 
            Serializer.Serialize(file, person); 
            }
            watch.Stop();
            Console.WriteLine(watch.ElapsedMilliseconds.ToString());
            Console.WriteLine("Person got created using protocol buffer in " + watch.ElapsedMilliseconds.ToString() + " milliseconds " );

            watch.Reset();
            watch.Start();
            System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(person.GetType());
            using (TextWriter w = new StreamWriter(XMLSerializedFileName))
            {
                x.Serialize(w, person);
            }
            watch.Stop();
            Console.WriteLine(watch.ElapsedMilliseconds.ToString());
            Console.WriteLine("Person got created using XML in " + watch.ElapsedMilliseconds.ToString() + " milliseconds");

            watch.Reset();
            watch.Start();
            using (Stream stream = File.Open(BinarySerializedFileName, FileMode.Create))
            {
                BinaryFormatter bformatter = new BinaryFormatter();
                //Console.WriteLine("Writing Employee Information");
                bformatter.Serialize(stream, person);
            }
            watch.Stop();
            Console.WriteLine(watch.ElapsedMilliseconds.ToString());
            Console.WriteLine("Person got created using binary in " + watch.ElapsedMilliseconds.ToString() + " milliseconds");

            Console.ReadLine();



    }
        } 


   [ProtoContract] 
    [Serializable]
    public class Person { 
        [ProtoMember(1)] 
        public int Id {get;set;}
        [ProtoMember(2)]
        public string Name { get; set; } 
        [ProtoMember(3)] 
        public Address Address {get;set;} 
    } 
    [ProtoContract]
    [Serializable]
    public class Address { 
        [ProtoMember(1)] 
        public string Line1 {get;set;} 
        [ProtoMember(2)] 
        public string Line2 {get;set;} 
    }
}

© Stack Overflow or respective owner

Related posts about serialization

Related posts about protobuf-net