public byte[] ToCurrentFormat()
        {
            //Update if Unit changed
            UpdateCustomUnits();

            var bytes = new List <byte>();

            bytes.AddRange(Signature.ToBytes(2));
            bytes.Add((byte)Version);

            //'for' instead 'foreach' for upgrade support

            for (var i = 0; i < InputPoint.GetCount(FileVersion); ++i)
            {
                var obj = Inputs.ElementAtOrDefault(i) ?? new InputPoint();
                obj.FileVersion = FileVersion;
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < OutputPoint.GetCount(FileVersion); ++i)
            {
                var obj = Outputs.ElementAtOrDefault(i) ?? new OutputPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < VariablePoint.GetCount(FileVersion); ++i)
            {
                var obj = Variables.ElementAtOrDefault(i) ?? new VariablePoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < ProgramPoint.GetCount(FileVersion); ++i)
            {
                var obj = Programs.ElementAtOrDefault(i) ?? new ProgramPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < ControllerPoint.GetCount(FileVersion); ++i)
            {
                var obj = Controllers.ElementAtOrDefault(i) ?? new ControllerPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < ScreenPoint.GetCount(FileVersion); ++i)
            {
                var obj = Screens.ElementAtOrDefault(i) ?? new ScreenPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < GraphicPoint.GetCount(FileVersion); ++i)
            {
                var obj = Graphics.ElementAtOrDefault(i) ?? new GraphicPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < UserPoint.GetCount(FileVersion); ++i)
            {
                var obj = Users.ElementAtOrDefault(i) ?? new UserPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < CustomDigitalUnitsPoint.GetCount(FileVersion); ++i)
            {
                var obj = CustomUnits.Digital.ElementAtOrDefault(i) ?? new CustomDigitalUnitsPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < TablePoint.GetCount(FileVersion); ++i)
            {
                var obj = Tables.ElementAtOrDefault(i) ?? new TablePoint();
                bytes.AddRange(obj.ToBytes());
            }

            {
                var settings = Settings ?? new Settings(FileVersion);
                bytes.AddRange(settings.ToBytes());
            }

            for (var i = 0; i < SchedulePoint.GetCount(FileVersion); ++i)
            {
                var obj = Schedules.ElementAtOrDefault(i) ?? new SchedulePoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < HolidayPoint.GetCount(FileVersion); ++i)
            {
                var obj = Holidays.ElementAtOrDefault(i) ?? new HolidayPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < MonitorPoint.GetCount(FileVersion); ++i)
            {
                var obj = Monitors.ElementAtOrDefault(i) ?? new MonitorPoint();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < ScheduleCode.GetCount(FileVersion); ++i)
            {
                var obj = ScheduleCodes.ElementAtOrDefault(i) ?? new ScheduleCode();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < HolidayCode.GetCount(FileVersion); ++i)
            {
                var obj = HolidayCodes.ElementAtOrDefault(i) ?? new HolidayCode();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < ProgramCode.GetCount(FileVersion); ++i)
            {
                var obj = ProgramCodes.ElementAtOrDefault(i) ?? new ProgramCode();
                bytes.AddRange(obj.ToBytes());
            }

            for (var i = 0; i < CustomAnalogUnitsPoint.GetCount(FileVersion); ++i)
            {
                var obj = CustomUnits.Analog.ElementAtOrDefault(i) ?? new CustomAnalogUnitsPoint();
                bytes.AddRange(obj.ToBytes());
            }

            if (!IsUpgraded)
            {
                CheckSize(bytes.Count, Length);
            }

            return(bytes.ToArray());
        }