public PrimitiveArrayInfo(DumpPrimitiveArray org) { PrimitiveArrayID = org.PrimitiveArrayID; Type = org.Type; ElementDatas = new List <object>(); for (var start = 0; start < org.ElementDatas.Length;) { var t = PrimitiveTypeHelper.GetPrimitiveValue(org.Type, org.ElementDatas, ref start); ElementDatas.Add(t); } if (Type == PrimitiveType.HPROF_BASIC_CHAR) { if (ElementDatas.Count > 0) { //if (ElementDatas.Exists(c=>(short)c>255 || (short)c<0))//此处为Unicode编码 { var temp = ElementDatas.Select(c => (short)c).ToArray(); var t2 = ByteConverter.Arr2Arr <short, byte>(temp); StringData = Encoding.Unicode.GetString(t2); } // else//此处为ASCII编码 // { // var temp = ElementDatas.Select(c => (byte)(short)c).ToArray(); // StringData = Encoding.Default.GetString(temp); // } } else { StringData = ""; } } }
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); }