public ObjectArrayInfo(DumpObjectArray org, HeapFileAnalyzer analyzer) { ClassObjectID = org.ClassObjectID; if (analyzer.ClassObjectInfos.ContainsKey(org.ClassObjectID)) { ClassObject = analyzer.ClassObjectInfos[org.ClassObjectID]; } ObjectArrayID = org.ObjectArrayID; ElementIDs = org.ElementIDs; }
public static HeapDumpSegment Deserialize(this HeapDumpSegment input, BinaryReader br) { (input as HeapRawData).Deserialize(br); if (input.RawData[0] == (byte)DumpObjectTag.HEAP_INFO) { input.SegmentType = DumpSegmentType.ObjectInstance; int startIndex = 1; //原本正常的情况 input.HeapInfo = new HeapInfo().Deserialize(input.RawData, ref startIndex); //原本正常的情况 input.HeapDumpObjects = new List <HeapDumpObject>(); //int startIndex = 0; //学长的特殊情况,不导出HeapInfo while (startIndex < input.RawData.Length) { HeapDumpObject newObject = null; var flag = input.RawData[startIndex]; ++startIndex; switch (flag) { case (byte)DumpObjectTag.CLASS_OBJECT: newObject = new DumpClassObject().Deserialize(input.RawData, ref startIndex, input); break; case (byte)DumpObjectTag.OBJECT_ARRAY: newObject = new DumpObjectArray().Deserialize(input.RawData, ref startIndex); break; case (byte)DumpObjectTag.OBJECT_INSTANCE: newObject = new DumpObjectInstance().Deserialize(input.RawData, ref startIndex); break; case (byte)DumpObjectTag.PRIMITIVE_ARRAY_WITH_DATA: newObject = new DumpPrimitiveArray().Deserialize(input.RawData, ref startIndex); break; case (byte)DumpObjectTag.PRIMITIVE_ARRAY_WITHOUT_DATA: newObject = new DumpPrimitiveArrayNoData().Deserialize(input.RawData, ref startIndex); break; default: throw new Exception("尚未处理的Dump类型: " + input.RawData[startIndex]); } input.HeapDumpObjects.Add(newObject); } } else { input.SegmentType = DumpSegmentType.RootSet; } return(input); }