internal SerializableCustomTiming ParseCustomFields(JsonObject customJson)
        {
            var custom = new SerializableCustomTiming();
            custom.DurationMilliseconds = ParseInt64(customJson["duration"]).GetValueOrDefault();
            custom.ExecuteType = customJson["executeType"];
            custom.Id = ParseGuid(customJson["id"]);
            custom.MachineName = customJson["machine"];
            custom.StartMilliseconds = ParseInt64(customJson["start"]).GetValueOrDefault();
            custom.Sort = ParseInt64(customJson["sort"]).GetValueOrDefault(custom.StartMilliseconds);
            custom.Started = ParseDateTime(customJson["started"]);
            custom.Name = customJson["name"];
            if (customJson.ContainsKey("tags")) custom.Tags = ParseTags(customJson.Child("tags"));
            custom.Type = customJson["type"];
            custom.ParentId = ParseGuid(customJson["parentId"]);
            custom.InputData = customJson["inputData"];
            custom.InputSize = ParseInt(customJson["inputSize"]);
            custom.OutputSize = ParseInt(customJson["outputSize"]).GetValueOrDefault();
            custom.OutputStartMilliseconds = ParseInt64(customJson["outputStartMilliseconds"]).GetValueOrDefault();

            return custom;
        }
        private CustomTiming CreateCustomTiming(SerializableCustomTiming sourceCustomTiming)
        {
            // ensure parentId
            ProfilingSession.ProfilingSessionContainer.CurrentSessionStepId = sourceCustomTiming.ParentId;

            var customTiming = new CustomTiming(this, sourceCustomTiming.Type, sourceCustomTiming.Name)
            {
                DurationMilliseconds = sourceCustomTiming.DurationMilliseconds,
                ExecuteType = sourceCustomTiming.ExecuteType,
                StartMilliseconds = sourceCustomTiming.StartMilliseconds,
                Sort = sourceCustomTiming.Sort,
                Tags = sourceCustomTiming.Tags == null ? null : new TagCollection(sourceCustomTiming.Tags),
                InputData = sourceCustomTiming.InputData,
                InputSize = sourceCustomTiming.InputSize,
                OutputSize = sourceCustomTiming.OutputSize,
                OutputStartMilliseconds = sourceCustomTiming.OutputStartMilliseconds
            };

            ProfilingSession.ProfilingSessionContainer.CurrentSessionStepId = null;

            return customTiming;
        }