public override void Run()
        {
            object obj;
            var numberOfObjects = 0L;
            var numberOfObjectByType = new Dictionary<Type, long>();

            using(var input = File.OpenRead(_path))
            using(var reader = new DecoratedObjectReader(input))
            {
                while((obj = reader.Read<object>()) != null)
                {
                    ++numberOfObjects;
                    if(numberOfObjectByType.ContainsKey(obj.GetType()))
                    {
                        ++numberOfObjectByType[obj.GetType()];
                    }
                    else
                    {
                        numberOfObjectByType[obj.GetType()] = 1;
                    }
                }
            }

            var fileInfo = new FileInfo(_path);

            WriteStatistics(new Statistics
            {
                FileName = fileInfo.Name,
                FileLength = fileInfo.Length,
                NumberOfObjects = numberOfObjects,
                NumberOfObjectByType = numberOfObjectByType
            });
        }
        public override void Run()
        {
            object obj;

            using(var input = File.OpenRead(_path))
            using(var reader = new DecoratedObjectReader(input))
            {
                while((obj = reader.Read<object>()) != null)
                {
                    Console.WriteLine("{0}", obj);
                }
            }
        }
        private void Fixup(string srcPath, string dstPath)
        {
            Message message;
            var stats = new Statistics();
            var classifier = new MessageClassifier();
            var translator = new LiveMessageTranslator();

            using(var input = File.OpenRead(srcPath))
            using(var reader = new DecoratedObjectReader(input))
            using(var output = File.Create(dstPath))
            using(var writer = new DecoratedObjectWriter(output))
            {
                while(true)
                {
                    if((message = reader.Read<Message>()) == null)
                    {
                        break;
                    }
                    ++stats.Read;
                    if(classifier.IsTranslated(message))
                    {
                        ++stats.OrgTranslated;
                        continue;
                    }
                    writer.Write(message);
                    ++stats.Written;
                    if((message = translator.Translate(message)) != null)
                    {
                        if(message is CompositeMessage)
                        {
                            foreach(var component in ((CompositeMessage)message).Messages)
                            {
                                writer.Write(component);
                                ++stats.Written;
                                ++stats.NewTranslated;
                            }
                        }
                        else
                        {
                            writer.Write(message);
                            ++stats.Written;
                            ++stats.NewTranslated;
                        }
                    }
                }
                writer.Write(null);
            }

            stats.Print();
        }
        public override void Run()
        {
            Message message;
            SessionModel session = new SessionModel();

            using(var input = File.OpenRead(_path))
            using(var reader = new DecoratedObjectReader(input))
            {
                while((message = reader.Read<Message>()) != null)
                {
                    session.Process(message);
                }
            }

            session.Print();
        }