public virtual void OptionsMenu(GenericMenu menu)
        {
            MenuItem("Tracing/Clear", false, () => DebuggerTracer.LoadData(null));

            MenuItem("Tracing/Load", false, () =>
            {
                if (!GetAssetAndTracePath(out var assetModel, out var _, out var traceName))
                {
                    return;
                }
                TraceDump traceDump;
                using (var traceStream = File.OpenRead(traceName))
                    traceDump = TraceDump.Deserialize(new BinaryReader(traceStream));
                var graphTrace = new DebuggerTracer.GraphTrace(traceDump.FrameData);
                DebuggerTracer.GraphReference graphReference = DebuggerTracer.GraphReference.FromId(assetModel.GetInstanceID());
                DebuggerTracer.LoadData(new Dictionary <DebuggerTracer.GraphReference, DebuggerTracer.GraphTrace>
                {
                    [graphReference] = graphTrace
                });
            });
        public static TraceDump Deserialize(BinaryReader reader)
        {
            var version = reader.ReadInt16();

            Assert.AreEqual(k_Version, version);
            var       path       = reader.ReadString();
            var       frameCount = reader.ReadInt32();
            var       frameData  = new DebuggerTracer.FrameData[frameCount];
            TraceDump graphData  = new TraceDump(path, frameData);

            for (int i = 0; i < frameCount; i++)
            {
                frameData[i] = new DebuggerTracer.FrameData(reader.ReadInt32());
                var entityCount = reader.ReadInt32();
                var entityData  = new Dictionary <DebuggerTracer.FrameData.EntityReference, DebuggerTracer.EntityFrameTrace>(entityCount);
                frameData[i].EntityFrameData = entityData;

                for (int j = 0; j < entityCount; j++)
                {
                    DebuggerTracer.FrameData.EntityReference entityRef = new DebuggerTracer.FrameData.EntityReference {
                        EntityIndex = reader.ReadInt32()
                    };
                    var entityFrameTrace = new DebuggerTracer.EntityFrameTrace();
                    {
                        entityFrameTrace.steps = new List <DebuggerTracer.EntityFrameTrace.NodeRecord>(reader.ReadInt32());
                        for (int k = 0; k < entityFrameTrace.steps.Capacity; k++)
                        {
                            entityFrameTrace.steps.Add(new DebuggerTracer.EntityFrameTrace.NodeRecord
                            {
                                nodeId1  = reader.ReadUInt64(),
                                nodeId2  = reader.ReadUInt64(),
                                progress = reader.ReadByte(),
                                type     = reader.ReadBoolean() ? DebuggerTracer.EntityFrameTrace.StepType.Exception : DebuggerTracer.EntityFrameTrace.StepType.None,
                            });
                        }
                    }
                    {
                        var valueCount = reader.ReadInt32();
                        entityFrameTrace.values =
                            new Dictionary <int, List <DebuggerTracer.EntityFrameTrace.ValueRecord> >(valueCount);
                        for (int k = 0; k < valueCount; k++)
                        {
                            var step = reader.ReadInt32();
                            List <DebuggerTracer.EntityFrameTrace.ValueRecord> values = new List <DebuggerTracer.EntityFrameTrace.ValueRecord>(reader.ReadInt32());

                            for (int l = 0; l < values.Capacity; l++)
                            {
                                values.Add(new DebuggerTracer.EntityFrameTrace.ValueRecord
                                {
                                    nodeId1       = reader.ReadUInt64(),
                                    nodeId2       = reader.ReadUInt64(),
                                    readableValue = reader.ReadString(),
                                });
                            }

                            entityFrameTrace.values.Add(step, values);
                        }
                    }
                    entityData.Add(entityRef, entityFrameTrace);
                }
            }

            return(graphData);
        }