Пример #1
0
        public void PasteFromClipboard()
        {
            string json = GUIUtility.systemCopyBuffer;

            if (!string.IsNullOrEmpty(json))
            {
                try
                {
                    SerializationContainer container = JsonUtility.FromJson <SerializationContainer>(json);
                    if (container != null)
                    {
                        List <Node> nodes = Graph.Deserialize(container.Nodes, container.Edges);
                        if (nodes != null && nodes.Count > 0)
                        {
                            Vector2 pastePosition = ProjectToGDICanvas(new Vector2(Screen.width / 2f, Screen.height / 2f));
                            Vector2 pasteOffset   = pastePosition - new Vector2(nodes[0].WindowRect.x, nodes[0].WindowRect.y);
                            Graph.MoveNodes(nodes, pasteOffset);
                            Graph.SetNewIds(nodes);
                            bool wasTrigger = Graph.TriggerEvents;
                            Graph.TriggerEvents = false;
                            Graph.AddNodes(nodes);
                            Graph.UpdateEdgeBounds();
                            Graph.TriggerEvents = wasTrigger;
                            _selectedNodes.Clear();
                            _selectedNodes = nodes;
                            ResetTextFieldFocus();
                        }
                    }
                }
                catch (ArgumentException e)
                {
                    Log.Info("Can not parse clipboard content. " + e.Message);
                }
            }
        }
        public void TestSerializationHelperElementCanSerialize()
        {
            var toSerialize = new List <SimpleSerializeClass>()
            {
                SimpleSerializeClass.instance
            };

            var serialized = SerializationHelper.Serialize <SimpleSerializeClass>(toSerialize);

            Assert.AreEqual(1, serialized.Count);

            var container = new SerializationContainer
            {
                serializedElements = serialized
            };

            var serializedContainer = JsonUtility.ToJson(container, true);

            var deserializedContainer = JsonUtility.FromJson <SerializationContainer>(serializedContainer);
            var loaded = SerializationHelper.Deserialize <SimpleSerializeClass>(deserializedContainer.serializedElements, null);

            Assert.AreEqual(1, loaded.Count);
            Assert.IsInstanceOf <SimpleSerializeClass>(loaded[0]);
            loaded[0].AssertAsReference();
        }
Пример #3
0
 private void CopyNodes(List <Node> nodes)
 {
     if (nodes != null && nodes.Count > 0)
     {
         SerializationContainer container = Graph.Serialize(nodes);
         string json = JsonUtility.ToJson(container);
         GUIUtility.systemCopyBuffer = json;
     }
 }
        public void Test1()
        {
            var container = new SerializationContainer();

            var sr = container.Add(new JsonContractSerializer());

            container.Start();

            var test = new Blah {
                Message = "Hmm"
            };

            var blob = container.PayloadSerialize(test);

            var resolve = container.PayloadDeserialize <Blah>(blob);

            Assert.AreEqual(test, resolve);
        }
Пример #5
0
        public void OnBeforeSerialize()
        {
            var sc = new SerializationContainer()
            {
                methods       = missingMethods.ToList(),
                fields        = missingFields.ToList(),
                properties    = missingProperties.ToList(),
                methodIndex   = methodIndex,
                fieldIndex    = fieldIndex,
                propertyIndex = propertyIndex
            };

            using (var ms = new MemoryStream())
            {
                var bf = new BinaryFormatter();
                bf.Serialize(ms, sc);
                serializationBytes = ms.ToArray();
            }
        }
    public static void SerializeScene()
    {
        List <SerializedObject> serializedObjects = new List <SerializedObject>();

        foreach (var platform in Object.FindObjectsOfType <SerializableObject>())
        {
            serializedObjects.Add(new SerializedObject(platform.GetBlueprintIndex(), platform as IInteractable));
        }

        var    container = new SerializationContainer(serializedObjects);
        string json      = JsonUtility.ToJson(container);

        var fileName = $"Level {DateTime.Now:yyyy-MM-dd_HH-mm-ss-fff}.json";
        var fullPath = GetFullPath(fileName);
        var file     = File.CreateText(fullPath);

        file.Write(json);
        file.Close();

        Creator.Instance.SaveLevel(in fullPath);
    }
 static void Main(string[] args)
 {
     var container = new SerializationContainer();
     container.ResolveSerializationParser()
              .Execute(args);
 }
        internal static SerializationContainer Serialize_Deserialize()
        {
            var Area = ExpectedValuesOfInitializationBLLTest.LoadTestdorfESTW();
            var Estw = Area.ESTWs.Single(e => e.Id == "TTST");

            Estw.Time          = new LeibitTime(eDaysOfService.Thursday, 13, 40);
            Estw.LastUpdatedOn = DateTime.Now.AddSeconds(-10);

            var Train = Area.Trains[2007];

            var LiveTrain = new TrainInformation(Train);

            LiveTrain.Block = Estw.Blocks["32G12"].First();

            var ProbeSchedule = new LiveSchedule(LiveTrain, Train.Schedules.FirstOrDefault(s => s.Station.ShortSymbol == "TPRB"));

            ProbeSchedule.LiveArrival   = new LeibitTime(eDaysOfService.Thursday, 13, 7);
            ProbeSchedule.LiveDeparture = new LeibitTime(eDaysOfService.Thursday, 13, 8);
            ProbeSchedule.LiveTrack     = ProbeSchedule.Schedule.Track;
            LiveTrain.AddSchedule(ProbeSchedule);

            var TestdorfSchedule = new LiveSchedule(LiveTrain, Train.Schedules.FirstOrDefault(s => s.Station.ShortSymbol == "TTST"));

            TestdorfSchedule.LiveArrival   = new LeibitTime(eDaysOfService.Thursday, 13, 12);
            TestdorfSchedule.LiveDeparture = new LeibitTime(eDaysOfService.Thursday, 13, 14);
            TestdorfSchedule.LiveTrack     = TestdorfSchedule.Schedule.Track;
            LiveTrain.AddSchedule(TestdorfSchedule);

            Area.LiveTrains.TryAdd(Train.Number, LiveTrain);


            Train = Area.Trains[12345];

            LiveTrain       = new TrainInformation(Train);
            LiveTrain.Block = Estw.Blocks["31G3"].First();

            ProbeSchedule             = new LiveSchedule(LiveTrain, Train.Schedules.FirstOrDefault(s => s.Station.ShortSymbol == "TPRB"));
            ProbeSchedule.LiveArrival = new LeibitTime(eDaysOfService.Thursday, 13, 14);
            ProbeSchedule.LiveTrack   = ProbeSchedule.Schedule.Track;
            LiveTrain.AddSchedule(ProbeSchedule);

            TestdorfSchedule               = new LiveSchedule(LiveTrain, Train.Schedules.FirstOrDefault(s => s.Station.ShortSymbol == "TTST"));
            TestdorfSchedule.LiveArrival   = new LeibitTime(eDaysOfService.Thursday, 13, 7);
            TestdorfSchedule.LiveDeparture = new LeibitTime(eDaysOfService.Thursday, 13, 10);
            TestdorfSchedule.LiveTrack     = TestdorfSchedule.Schedule.Track;
            LiveTrain.AddSchedule(TestdorfSchedule);

            Area.LiveTrains.TryAdd(Train.Number, LiveTrain);


            Train = Area.Trains[12346];

            LiveTrain       = new TrainInformation(Train);
            LiveTrain.Block = Estw.Blocks["32G22"].First();

            ProbeSchedule               = new LiveSchedule(LiveTrain, Train.Schedules.FirstOrDefault(s => s.Station.ShortSymbol == "TPRB"));
            ProbeSchedule.LiveArrival   = new LeibitTime(eDaysOfService.Thursday, 13, 15);
            ProbeSchedule.LiveDeparture = new LeibitTime(eDaysOfService.Thursday, 13, 25);
            ProbeSchedule.LiveTrack     = ProbeSchedule.Schedule.Track;

            var ProbeDelay = ProbeSchedule.AddDelay(5, eDelayType.Departure);

            ProbeDelay.Reason = "Meep";

            LiveTrain.AddSchedule(ProbeSchedule);

            TestdorfSchedule               = new LiveSchedule(LiveTrain, Train.Schedules.FirstOrDefault(s => s.Station.ShortSymbol == "TTST"));
            TestdorfSchedule.LiveArrival   = new LeibitTime(eDaysOfService.Thursday, 13, 29);
            TestdorfSchedule.LiveDeparture = new LeibitTime(eDaysOfService.Thursday, 13, 30);
            TestdorfSchedule.LiveTrack     = TestdorfSchedule.Schedule.Station.Tracks.Single(t => t.Name == "2");
            LiveTrain.AddSchedule(TestdorfSchedule);

            Area.LiveTrains.TryAdd(Train.Number, LiveTrain);

            var Result = new SerializationContainer();

            Result.Area = Area;
            return(Result);
        }
Пример #9
0
        private void __Save()
        {
            if (m_CurrentFilename.IsNullOrEmpty())
            {
                __SaveAs();
                return;
            }

            var Container = new SerializationContainer();

            Container.Area            = m_CurrentArea;
            Container.VisibleStations = Runtime.VisibleStations.Select(s => new SerializedStation {
                EstwId = s.ESTW.Id, ShortSymbol = s.ShortSymbol
            }).ToList();

            foreach (var Window in ChildWindows)
            {
                var SerializedWindow = new SerializedWindowInformation();

                if (Window is DelayJustificationView)
                {
                    SerializedWindow.Type = eChildWindowType.DelayJustification;
                    SerializedWindow.Tag  = (Window.DataContext as DelayJustificationViewModel).CurrentTrain.Train.Number;
                }
                else if (Window is ESTWSelectionView)
                {
                    SerializedWindow.Type = eChildWindowType.ESTWSelection;
                }
                else if (Window is SettingsView)
                {
                    SerializedWindow.Type = eChildWindowType.Settings;
                }
                else if (Window is TimeTableView)
                {
                    SerializedWindow.Type = eChildWindowType.TimeTable;
                    SerializedWindow.Tag  = (Window.DataContext as TimeTableViewModel).CurrentStation.ShortSymbol;
                }
                else if (Window is TrainProgressInformationView)
                {
                    SerializedWindow.Type = eChildWindowType.TrainProgressInformation;
                }
                else if (Window is TrainScheduleView)
                {
                    SerializedWindow.Type = eChildWindowType.TrainSchedule;
                    SerializedWindow.Tag  = (Window.DataContext as TrainScheduleViewModel).CurrentTrain.Number;
                }
                else if (Window is LocalOrdersView)
                {
                    SerializedWindow.Type = eChildWindowType.LocalOrders;

                    var VM = Window.DataContext as LocalOrdersViewModel;
                    SerializedWindow.Tag = new KeyValuePair <int, string>(VM.CurrentSchedule.Train.Number, VM.CurrentSchedule.Station.ShortSymbol);
                }
                else if (Window is SystemStateView)
                {
                    SerializedWindow.Type = eChildWindowType.SystemState;
                }
                else
                {
                    continue;
                }

                SerializedWindow.Width     = Window.Width;
                SerializedWindow.Height    = Window.Height;
                SerializedWindow.PositionX = Window.PositionX;
                SerializedWindow.PositionY = Window.PositionY;

                Container.Windows.Add(SerializedWindow);
            }

            var SaveResult = m_SerializationBll.Save(m_CurrentFilename, Container);

            if (SaveResult.Succeeded)
            {
                StatusBarText = "Aktueller Zustand gespeichert";
            }
            else
            {
                ShowMessage(SaveResult);
            }
        }
Пример #10
0
        public OperationResult <SerializedRoot> Save(string Filename, SerializationContainer Request)
        {
            try
            {
                var SettingsResult = SettingsBll.GetSettings();
                ValidateResult(SettingsResult);
                var Settings = SettingsResult.Result;

                var Result = new OperationResult <SerializedRoot>();

                var Root = new SerializedRoot();
                Root.AreaId = Request.Area.Id;
                Root.LoadedESTWs.AddRange(Request.Area.ESTWs.Where(e => e.IsLoaded).Select(e => new SerializedESTW
                {
                    ESTWId    = e.Id,
                    Time      = e.Time,
                    StartTime = e.StartTime,
                    IsActive  = (DateTime.Now - e.LastUpdatedOn).TotalSeconds < Settings.EstwTimeout,
                }));

                Root.Version = Assembly.GetEntryAssembly().GetCustomAttribute <AssemblyInformationalVersionAttribute>()?.InformationalVersion;

                foreach (var Train in Request.Area.LiveTrains.Values)
                {
                    var SerializedTrain = new SerializedTrain();
                    SerializedTrain.TrainNumber    = Train.Train.Number;
                    SerializedTrain.Delay          = Train.Delay;
                    SerializedTrain.LastModified   = Train.LastModified;
                    SerializedTrain.CreatedOn      = Train.CreatedOn;
                    SerializedTrain.TrainDirection = Train.Direction;
                    SerializedTrain.IsDestinationStationCancelled = Train.IsDestinationStationCancelled;

                    foreach (var block in Train.BlockHistory)
                    {
                        var serializedBlock = new SerializedBlock();
                        serializedBlock.EstwId    = block.Track.Station.ESTW.Id;
                        serializedBlock.Name      = block.Name;
                        serializedBlock.Direction = block.Direction;
                        SerializedTrain.BlockHistory.Add(serializedBlock);
                    }

                    if (Train.Block != null)
                    {
                        SerializedTrain.CurrentEstwId  = Train.Block.Track.Station.ESTW.Id;
                        SerializedTrain.Block          = Train.Block.Name;
                        SerializedTrain.BlockDirection = Train.Block.Direction;
                    }

                    foreach (var Schedule in Train.Schedules)
                    {
                        var SerializedSchedule = new SerializedSchedule();
                        SerializedSchedule.EstwId                 = Schedule.Schedule.Station.ESTW.Id;
                        SerializedSchedule.StationShortSymbol     = Schedule.Schedule.Station.ShortSymbol;
                        SerializedSchedule.StationTime            = Schedule.Schedule.Time;
                        SerializedSchedule.LiveArrival            = Schedule.LiveArrival;
                        SerializedSchedule.LiveDeparture          = Schedule.LiveDeparture;
                        SerializedSchedule.IsArrived              = Schedule.IsArrived;
                        SerializedSchedule.IsDeparted             = Schedule.IsDeparted;
                        SerializedSchedule.ExpectedArrival        = Schedule.ExpectedArrival;
                        SerializedSchedule.ExpectedDeparture      = Schedule.ExpectedDeparture;
                        SerializedSchedule.ExpectedDelayArrival   = Schedule.ExpectedDelayArrival;
                        SerializedSchedule.ExpectedDelayDeparture = Schedule.ExpectedDelayDeparture;
                        SerializedSchedule.IsComposed             = Schedule.IsComposed;
                        SerializedSchedule.IsPrepared             = Schedule.IsPrepared;
                        SerializedSchedule.IsCancelled            = Schedule.IsCancelled;
                        SerializedSchedule.IsManuallyModified     = Schedule.IsManuallyModified;

                        if (Schedule.LiveTrack != null)
                        {
                            SerializedSchedule.LiveTrack = Schedule.LiveTrack.Name;
                        }

                        foreach (var Delay in Schedule.Delays)
                        {
                            var SerializedDelay = new SerializedDelay();
                            SerializedDelay.Type     = Delay.Type;
                            SerializedDelay.Minutes  = Delay.Minutes;
                            SerializedDelay.Reason   = Delay.Reason;
                            SerializedDelay.CausedBy = Delay.CausedBy;
                            SerializedSchedule.Delays.Add(SerializedDelay);
                        }

                        SerializedTrain.Schedules.Add(SerializedSchedule);
                    }

                    Root.LiveTrains.Add(SerializedTrain);
                }

                Root.Windows         = Request.Windows;
                Root.VisibleStations = Request.VisibleStations;
                Root.VisibleTrains   = Request.VisibleTrains;
                Root.HiddenSchedules = Request.HiddenSchedules;

                using (var Stream = new FileStream(Filename, FileMode.Create, FileAccess.Write))
                {
                    m_Formatter.Serialize(Stream, Root);
                }

                Result.Result    = Root;
                Result.Succeeded = true;
                return(Result);
            }
            catch (Exception ex)
            {
                return(new OperationResult <SerializedRoot> {
                    Message = ex.Message
                });
            }
        }
Пример #11
0
        public OperationResult <SerializationContainer> Open(string Filename)
        {
            try
            {
                var SettingsResult = SettingsBll.GetSettings();
                ValidateResult(SettingsResult);
                var Settings = SettingsResult.Result;

                var Container = new SerializationContainer();

                var File = new FileInfo(Filename);

                if (!File.Exists)
                {
                    throw new OperationFailedException(String.Format("File '{0}' does not exist.", Filename));
                }

                SerializedRoot Root;

                using (var Stream = File.OpenRead())
                {
                    Root = m_Formatter.Deserialize(Stream) as SerializedRoot;
                }

                if (Root == null)
                {
                    throw new OperationFailedException("Invalid file.");
                }

                var AreaResult = InitializationBll.GetAreaInformation();
                ValidateResult(AreaResult);

                var Area = AreaResult.Result.FirstOrDefault(a => a.Id == Root.AreaId);

                if (Area == null)
                {
                    throw new OperationFailedException("Invalid area.");
                }

                foreach (var SerializedEstw in Root.LoadedESTWs)
                {
                    if (!Settings.LoadInactiveEstws && !SerializedEstw.IsActive)
                    {
                        continue;
                    }

                    var Estw = Area.ESTWs.FirstOrDefault(e => e.Id == SerializedEstw.ESTWId);

                    if (Estw == null)
                    {
                        throw new OperationFailedException("Invalid ESTW.");
                    }

                    var LoadResult = InitializationBll.LoadESTW(Estw);
                    ValidateResult(LoadResult);
                    Estw.Time      = SerializedEstw.Time;
                    Estw.StartTime = SerializedEstw.StartTime;
                }

                foreach (var SerializedTrain in Root.LiveTrains)
                {
                    var Estw = Area.ESTWs.SingleOrDefault(e => e.Id == SerializedTrain.CurrentEstwId);

                    if (Estw?.IsLoaded == false || !Area.Trains.ContainsKey(SerializedTrain.TrainNumber))
                    {
                        continue;
                    }

                    var Train     = Area.Trains[SerializedTrain.TrainNumber];
                    var LiveTrain = new TrainInformation(Train);
                    LiveTrain.Delay        = SerializedTrain.Delay;
                    LiveTrain.LastModified = SerializedTrain.LastModified;
                    LiveTrain.CreatedOn    = SerializedTrain.CreatedOn;
                    LiveTrain.Direction    = SerializedTrain.TrainDirection;
                    LiveTrain.IsDestinationStationCancelled = SerializedTrain.IsDestinationStationCancelled;

                    if (SerializedTrain.BlockHistory != null)
                    {
                        foreach (var block in SerializedTrain.BlockHistory)
                        {
                            var estw2 = Area.ESTWs.SingleOrDefault(e => e.Id == block.EstwId);

                            if (estw2 == null || !estw2.Blocks.ContainsKey(block.Name))
                            {
                                continue;
                            }

                            LiveTrain.BlockHistory.AddIfNotNull(estw2.Blocks[block.Name].FirstOrDefault(b => b.Direction == block.Direction));
                        }
                    }

                    if (SerializedTrain.Block != null && Estw.Blocks.ContainsKey(SerializedTrain.Block))
                    {
                        LiveTrain.Block = Estw.Blocks[SerializedTrain.Block].FirstOrDefault(b => b.Direction == SerializedTrain.BlockDirection);
                    }

                    var SchedulesResult = CalculationBll.GetSchedulesByTime(Train.Schedules, Estw?.Time ?? SerializedTrain.LastModified);
                    ValidateResult(SchedulesResult);

                    foreach (var SerializedSchedule in SerializedTrain.Schedules)
                    {
                        var Schedule = SchedulesResult.Result.FirstOrDefault(s => s.Station.ShortSymbol == SerializedSchedule.StationShortSymbol &&
                                                                             s.Time == SerializedSchedule.StationTime &&
                                                                             (s.Station.ESTW.Id == SerializedSchedule.EstwId || SerializedSchedule.EstwId == null));

                        if (Schedule == null)
                        {
                            continue;
                        }

                        var LiveSchedule = new LiveSchedule(LiveTrain, Schedule);
                        LiveSchedule.LiveArrival        = SerializedSchedule.LiveArrival;
                        LiveSchedule.LiveDeparture      = SerializedSchedule.LiveDeparture;
                        LiveSchedule.IsArrived          = SerializedSchedule.IsArrived;
                        LiveSchedule.IsDeparted         = SerializedSchedule.IsDeparted;
                        LiveSchedule.ExpectedArrival    = SerializedSchedule.ExpectedArrival;
                        LiveSchedule.ExpectedDeparture  = SerializedSchedule.ExpectedDeparture;
                        LiveSchedule.IsComposed         = SerializedSchedule.IsComposed;
                        LiveSchedule.IsPrepared         = SerializedSchedule.IsPrepared;
                        LiveSchedule.IsCancelled        = SerializedSchedule.IsCancelled;
                        LiveSchedule.IsManuallyModified = SerializedSchedule.IsManuallyModified;

                        if (SerializedSchedule.ExpectedDelay.HasValue)
                        {
                            // Ensure compatibility
                            LiveSchedule.ExpectedDelayDeparture = SerializedSchedule.ExpectedDelay;
                        }
                        else
                        {
                            LiveSchedule.ExpectedDelayArrival   = SerializedSchedule.ExpectedDelayArrival;
                            LiveSchedule.ExpectedDelayDeparture = SerializedSchedule.ExpectedDelayDeparture;
                        }

                        if (SerializedSchedule.LiveTrack.IsNotNullOrEmpty())
                        {
                            LiveSchedule.LiveTrack = Schedule.Station.Tracks.SingleOrDefault(t => t.Name == SerializedSchedule.LiveTrack);
                        }

                        if (LiveSchedule.LiveArrival != null)
                        {
                            LiveSchedule.IsArrived = true;
                        }
                        if (LiveSchedule.LiveDeparture != null)
                        {
                            LiveSchedule.IsDeparted = true;
                        }

                        foreach (var SerializedDelay in SerializedSchedule.Delays)
                        {
                            var Delay = LiveSchedule.AddDelay(SerializedDelay.Minutes, SerializedDelay.Type);
                            Delay.Reason   = SerializedDelay.Reason;
                            Delay.CausedBy = SerializedDelay.CausedBy;
                        }

                        LiveTrain.AddSchedule(LiveSchedule);
                    }

                    if (Estw != null)
                    {
                        // Don't validate result here. When this fails, it's not so dramatic...
                        var prevResult = CalculationBll.GetPreviousService(Train, Estw);
                        if (prevResult.Succeeded)
                        {
                            LiveTrain.PreviousService = prevResult.Result;
                        }

                        var followUpResult = CalculationBll.GetFollowUpService(Train, Estw);
                        if (followUpResult.Succeeded)
                        {
                            LiveTrain.FollowUpService = followUpResult.Result;
                        }
                    }

                    if (LiveTrain.Schedules.Any())
                    {
                        Area.LiveTrains.TryAdd(Train.Number, LiveTrain);
                    }
                }

                foreach (var Estw in Area.ESTWs)
                {
                    if (Estw.StartTime == null)
                    {
                        var schedules = Area.LiveTrains.Values.SelectMany(t => t.Schedules).Where(s => s.Schedule.Station.ESTW == Estw);

                        if (schedules.Any())
                        {
                            Estw.StartTime = schedules.Min(s => s.LiveArrival);

                            var minStartTime = Estw.Time.AddHours(-12);

                            if (Estw.StartTime < minStartTime)
                            {
                                Estw.StartTime = minStartTime;
                            }
                        }
                        else
                        {
                            Estw.StartTime = Estw.Time;
                        }
                    }
                }

                Container.Area            = Area;
                Container.VisibleStations = Root.VisibleStations;
                Container.VisibleTrains   = Root.VisibleTrains;
                Container.HiddenSchedules = Root.HiddenSchedules;
                Container.Windows         = Root.Windows;
                Container.IsOldVersion    = Root.Version != Assembly.GetEntryAssembly().GetCustomAttribute <AssemblyInformationalVersionAttribute>()?.InformationalVersion;

                var Result = new OperationResult <SerializationContainer>();
                Result.Result    = Container;
                Result.Succeeded = true;
                return(Result);
            }
            catch (Exception ex)
            {
                return(new OperationResult <SerializationContainer> {
                    Message = ex.Message
                });
            }
        }
        /// <summary>
        /// THis method returns the default scheduler container.
        /// </summary>
        protected virtual SerializationContainer InitialiseSerializationContainer()
        {
            var container = new SerializationContainer(Policy.Serialization);

            return(container);
        }
Пример #13
0
        public OperationResult <SerializationContainer> Open(string Filename)
        {
            try
            {
                var SettingsResult = SettingsBll.GetSettings();
                ValidateResult(SettingsResult);
                var Settings = SettingsResult.Result;

                var Container = new SerializationContainer();

                var File = new FileInfo(Filename);

                if (!File.Exists)
                {
                    throw new OperationFailedException(String.Format("File '{0}' does not exist.", Filename));
                }

                SerializedRoot Root;

                using (var Stream = File.OpenRead())
                {
                    Root = m_Formatter.Deserialize(Stream) as SerializedRoot;
                }

                if (Root == null)
                {
                    throw new OperationFailedException("Invalid file.");
                }

                var AreaResult = InitializationBll.GetAreaInformation();
                ValidateResult(AreaResult);

                var Area = AreaResult.Result.FirstOrDefault(a => a.Id == Root.AreaId);

                if (Area == null)
                {
                    throw new OperationFailedException("Invalid area.");
                }

                foreach (var SerializedEstw in Root.LoadedESTWs)
                {
                    if (!Settings.LoadInactiveEstws && !SerializedEstw.IsActive)
                    {
                        continue;
                    }

                    var Estw = Area.ESTWs.FirstOrDefault(e => e.Id == SerializedEstw.ESTWId);

                    if (Estw == null)
                    {
                        throw new OperationFailedException("Invalid ESTW.");
                    }

                    var LoadResult = InitializationBll.LoadESTW(Estw);
                    ValidateResult(LoadResult);
                    Estw.Time = SerializedEstw.Time;
                }

                foreach (var SerializedTrain in Root.LiveTrains)
                {
                    var Estw = Area.ESTWs.SingleOrDefault(e => e.Id == SerializedTrain.CurrentEstwId);

                    if (Estw == null || !Estw.IsLoaded || !Area.Trains.ContainsKey(SerializedTrain.TrainNumber))
                    {
                        continue;
                    }

                    var Train     = Area.Trains[SerializedTrain.TrainNumber];
                    var LiveTrain = new TrainInformation(Train);
                    LiveTrain.Delay        = SerializedTrain.Delay;
                    LiveTrain.LastModified = SerializedTrain.LastModified;
                    LiveTrain.Direction    = SerializedTrain.TrainDirection;

                    if (Estw.Blocks.ContainsKey(SerializedTrain.Block))
                    {
                        LiveTrain.Block = Estw.Blocks[SerializedTrain.Block].FirstOrDefault(b => b.Direction == SerializedTrain.BlockDirection);
                    }

                    var SchedulesResult = CalculationBll.GetSchedulesByTime(Train.Schedules, Estw.Time);
                    ValidateResult(SchedulesResult);

                    foreach (var SerializedSchedule in SerializedTrain.Schedules)
                    {
                        var Schedule = SchedulesResult.Result.FirstOrDefault(s => s.Station.ShortSymbol == SerializedSchedule.StationShortSymbol &&
                                                                             s.Time == SerializedSchedule.StationTime &&
                                                                             (s.Station.ESTW.Id == SerializedSchedule.EstwId || SerializedSchedule.EstwId == null));

                        if (Schedule == null)
                        {
                            continue;
                        }

                        var LiveSchedule = new LiveSchedule(LiveTrain, Schedule);
                        LiveSchedule.LiveArrival       = SerializedSchedule.LiveArrival;
                        LiveSchedule.LiveDeparture     = SerializedSchedule.LiveDeparture;
                        LiveSchedule.IsArrived         = SerializedSchedule.IsArrived;
                        LiveSchedule.IsDeparted        = SerializedSchedule.IsDeparted;
                        LiveSchedule.ExpectedArrival   = SerializedSchedule.ExpectedArrival;
                        LiveSchedule.ExpectedDeparture = SerializedSchedule.ExpectedDeparture;
                        LiveSchedule.ExpectedDelay     = SerializedSchedule.ExpectedDelay;

                        if (SerializedSchedule.LiveTrack.IsNotNullOrEmpty())
                        {
                            LiveSchedule.LiveTrack = Schedule.Station.Tracks.SingleOrDefault(t => t.Name == SerializedSchedule.LiveTrack);
                        }

                        foreach (var SerializedDelay in SerializedSchedule.Delays)
                        {
                            var Delay = LiveSchedule.AddDelay(SerializedDelay.Minutes, SerializedDelay.Type);
                            Delay.Reason   = SerializedDelay.Reason;
                            Delay.CausedBy = SerializedDelay.CausedBy;
                        }

                        LiveTrain.AddSchedule(LiveSchedule);
                    }

                    if (LiveTrain.Schedules.Any())
                    {
                        Area.LiveTrains.TryAdd(Train.Number, LiveTrain);
                    }
                }

                Container.Area            = Area;
                Container.VisibleStations = Root.VisibleStations;
                Container.Windows         = Root.Windows;

                var Result = new OperationResult <SerializationContainer>();
                Result.Result    = Container;
                Result.Succeeded = true;
                return(Result);
            }
            catch (Exception ex)
            {
                return(new OperationResult <SerializationContainer> {
                    Message = ex.Message
                });
            }
        }