Click here to Skip to main content
15,891,951 members
Articles / Programming Languages / C#

BinaryFormatter vs. Manual Serializing

Rate me:
Please Sign up or sign in to vote.
4.92/5 (13 votes)
13 Jan 2012CPOL6 min read 118.6K   4.3K   25  
Comparison of serializing with BinaryFormatter (standard .NET class) against manual per-byte serializing; some pros and cons before selecting the right method for you.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ProtoBuf;

namespace BinaryFormatterVsManualCoding
{
    [Serializable]
    [ProtoBuf.ProtoContract]
    public class Person
    {
        [ProtoMember(3)]
        private List<CreditCard> cards = new List<CreditCard>();

        [ProtoMember(1)]
        public string Name { get; private set; }

        [ProtoMember(2)]
        public DateTime BirthDate { get; private set; }

        
        public IEnumerable<CreditCard> Cards 
        {
            get { return cards; }
        }

        internal Person() { }

        public Person(string name, DateTime birthDate)
        {
            Name = name;
            BirthDate = birthDate;
        }

        public Person(string name, DateTime birthDate, IEnumerable<CreditCard> someCards):this(name, birthDate)
        {
            cards.AddRange(someCards);
        }

        public void AddNewCard(CreditCard aCard)
        {
            cards.Add(aCard);
        }

        public static void WriteToStream(Person toWrite, Stream where)
        {
            BinaryWriter writer = new BinaryWriter(where);
            writer.Write(toWrite.Name);
            writer.Write(toWrite.BirthDate.Ticks);
            List<CreditCard> cards = toWrite.Cards.ToList();
            writer.Write(cards.Count);
            foreach (var next in cards)
            {
                CreditCard.WriteToStream(next, writer);
            }
        }

        public static Person ReadFromStream(Stream from)
        {
            BinaryReader reader = new BinaryReader(from);
            string name = reader.ReadString();
            long ticks = reader.ReadInt64();
            DateTime birthDate = new DateTime(ticks);
            int cardsCount = reader.ReadInt32();
            List<CreditCard> cards = new List<CreditCard>();
            for (int i = 0; i < cardsCount; ++i)
            {
                cards.Add(CreditCard.ReadFromStream(reader));
            }
            return new Person(name, birthDate, cards);
        }


    }

    [ProtoBuf.ProtoContract]
    [Serializable]
    public class CreditCard
    {
        [ProtoMember(1)]
        public string Number { get; private set; }
        
        [ProtoMember(2)]
        public DateTime ExpirationDate { get; private set; }

        internal CreditCard() { }

        public CreditCard(string cardNumber, DateTime expirationDate)
        {
            Number = cardNumber;
            ExpirationDate = expirationDate;
        }

        public static void WriteToStream(CreditCard toWrite, Stream where)
        {
            BinaryWriter writer = new BinaryWriter(where);
            WriteToStream(toWrite, writer);
        }

        public static void WriteToStream(CreditCard toWrite, BinaryWriter writer)
        {
            writer.Write(toWrite.Number);
            writer.Write(toWrite.ExpirationDate.Ticks);
        }

        public static CreditCard ReadFromStream(Stream from)
        {
            BinaryReader reader = new BinaryReader(from);
            return ReadFromStream(reader);
        }

        public static CreditCard ReadFromStream(BinaryReader reader)
        {
            string number = reader.ReadString();
            long ticks = reader.ReadInt64();
            DateTime expDate = new DateTime(ticks);
            return new CreditCard(number, expDate);
        }
        
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Crypton-M
Ukraine Ukraine
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions