private static void DoSendMessage()
        {
            while (true)
            {
                try
                {
                    if (m_sendThread == null)
                    {
                        UnityEngine.Debug.LogError("<color=#ff0000>m_sendThread null</color>");
                        return;
                    }
                    if (m_sampleQueue.Count > 0)
                    {
                        while (m_sampleQueue.Count > 0)
                        {
                            NetBase s = null;
                            lock (m_sampleQueue)
                            {
                                s = m_sampleQueue.Dequeue();
                            }
                            bw.Write(PACK_HEAD);
                            if (s is Sample)
                            {
                                bw.Write((int)0);
                            }
                            else if (s is LuaRefInfo)
                            {
                                bw.Write((int)1);
                            }
                            Serialize(s, bw);
                            s.Restore();
                        }
                    }
                    else if (m_frameCount != HookLuaSetup.frameCount)
                    {
                        bw.Write(PACK_HEAD);
                        //写入message 头编号
                        bw.Write((int)0);
                        Sample s = Sample.Create(0, (int)LuaLib.GetLuaMemory(LuaProfiler.mainL), "");
                        Serialize(s, bw);
                        s.Restore();
                        m_frameCount = HookLuaSetup.frameCount;
                    }
                    Thread.Sleep(10);
                }
#pragma warning disable 0168
                catch (ThreadAbortException e) { }
                catch (Exception e)
                {
                    UnityEngine.Debug.Log(e);
                    Close();
                }
#pragma warning restore 0168
            }
        }
        //private static Dictionary<string, Sample> m_sampleDict = new Dictionary<string, Sample>(256);

        public static void SendMessage(NetBase sample)
        {
            if (m_client == null)
            {
                return;
            }
            lock (m_sampleQueue)
            {
                m_sampleQueue.Enqueue(sample);
            }
        }
Пример #3
0
        private static void DoSendMessage()
        {
            while (true)
            {
                try
                {
                    if (m_sendThread == null)
                    {
                        return;
                    }
                    if (m_sampleQueue.Count > 0)
                    {
                        while (m_sampleQueue.Count > 0)
                        {
                            NetBase s = null;
                            lock (m_sampleQueue)
                            {
                                s = m_sampleQueue.Dequeue();
                            }
                            bw.Write(PACK_HEAD);
                            if (s is Sample)
                            {
                                bw.Write((int)0);
                            }
                            else if (s is LuaRefInfo)
                            {
                                bw.Write((int)1);
                            }
                            else if (s is LuaDiffInfo)
                            {
                                bw.Write((int)2);
                            }
                            Serialize(s, bw);
                            s.Restore();
                        }
                    }
                    Thread.Sleep(10);
                }
#pragma warning disable 0168
                catch (ThreadAbortException e) { }
                catch (Exception e)
                {
                    Close();
                }
#pragma warning restore 0168
            }
        }
Пример #4
0
        private static void Serialize(NetBase o, BinaryWriter bw)
        {
            if (o is Sample)
            {
                Sample s = (Sample)o;

                bw.Write(s.calls);
                bw.Write(s.frameCount);
                bw.Write(s.fps);
                bw.Write(s.pss);
                bw.Write(s.power);
                bw.Write(s.costLuaGC);
                bw.Write(s.costMonoGC);
                WriteString(bw, s.name);

                bw.Write(s.costTime);
                bw.Write(s.currentLuaMemory);
                bw.Write(s.currentMonoMemory);
                bw.Write((ushort)s.childs.Count);
                m_sleep_count++;
                if (m_sleep_count >= 8)
                {
                    Thread.Sleep(0);
                    m_sleep_count = 0;
                }


                var childs = s.childs;
                for (int i = 0; i < childs.Count; i++)
                {
                    Serialize(childs[i], bw);
                }
            }
            else if (o is LuaRefInfo)
            {
                LuaRefInfo r = (LuaRefInfo)o;

                bw.Write(r.cmd);
                bw.Write(HookLuaSetup.frameCount);
                WriteString(bw, r.name);
                WriteString(bw, r.addr);
                bw.Write(r.type);
                Thread.Sleep(0);
            }
            m_sleep_count = 0;
        }
Пример #5
0
        private static void Serialize(NetBase o, BinaryWriter bw)
        {
            if (o is Sample)
            {
                Sample s = (Sample)o;

                bw.Write(s.calls);
                bw.Write(s.frameCount);
                bw.Write(s.costLuaGC);
                bw.Write(s.costMonoGC);
                WriteString(bw, s.name);

                bw.Write(s.costTime);
                bw.Write(s.currentLuaMemory);
                bw.Write(s.currentMonoMemory);
                bw.Write((ushort)s.childs.Count);

                // 防止多线程 栈展开故意做的优化,先自己展开28层,后面的就递归
                var childs0 = s.childs;
                for (int i0 = 0, i0max = childs0.Count; i0 < i0max; i0++)
                {
                    Sample s0 = childs0[i0];
                    bw.Write(s0.calls);
                    bw.Write(s0.frameCount);
                    bw.Write(s0.costLuaGC);
                    bw.Write(s0.costMonoGC);
                    WriteString(bw, s0.name);

                    bw.Write(s0.costTime);
                    bw.Write(s0.currentLuaMemory);
                    bw.Write(s0.currentMonoMemory);
                    bw.Write((ushort)s0.childs.Count);
                    var childs1 = s0.childs;
                    for (int i1 = 0, i1max = childs1.Count; i1 < i1max; i1++)
                    {
                        Sample s1 = childs1[i1];
                        bw.Write(s1.calls);
                        bw.Write(s1.frameCount);
                        bw.Write(s1.costLuaGC);
                        bw.Write(s1.costMonoGC);
                        WriteString(bw, s1.name);

                        bw.Write(s1.costTime);
                        bw.Write(s1.currentLuaMemory);
                        bw.Write(s1.currentMonoMemory);
                        bw.Write((ushort)s1.childs.Count);
                        var childs2 = s1.childs;
                        for (int i2 = 0, i2max = childs2.Count; i2 < i2max; i2++)
                        {
                            Sample s2 = childs2[i2];
                            bw.Write(s2.calls);
                            bw.Write(s2.frameCount);
                            bw.Write(s2.costLuaGC);
                            bw.Write(s2.costMonoGC);
                            WriteString(bw, s2.name);

                            bw.Write(s2.costTime);
                            bw.Write(s2.currentLuaMemory);
                            bw.Write(s2.currentMonoMemory);
                            bw.Write((ushort)s2.childs.Count);
                            var childs3 = s2.childs;
                            for (int i3 = 0, i3max = childs3.Count; i3 < i3max; i3++)
                            {
                                Sample s3 = childs3[i3];
                                bw.Write(s3.calls);
                                bw.Write(s3.frameCount);
                                bw.Write(s3.costLuaGC);
                                bw.Write(s3.costMonoGC);
                                WriteString(bw, s3.name);

                                bw.Write(s3.costTime);
                                bw.Write(s3.currentLuaMemory);
                                bw.Write(s3.currentMonoMemory);
                                bw.Write((ushort)s3.childs.Count);
                                var childs4 = s3.childs;
                                for (int i4 = 0, i4max = childs4.Count; i4 < i4max; i4++)
                                {
                                    Sample s4 = childs4[i4];
                                    bw.Write(s4.calls);
                                    bw.Write(s4.frameCount);
                                    bw.Write(s4.costLuaGC);
                                    bw.Write(s4.costMonoGC);
                                    WriteString(bw, s4.name);

                                    bw.Write(s4.costTime);
                                    bw.Write(s4.currentLuaMemory);
                                    bw.Write(s4.currentMonoMemory);
                                    bw.Write((ushort)s4.childs.Count);
                                    var childs5 = s4.childs;
                                    for (int i5 = 0, i5max = childs5.Count; i5 < i5max; i5++)
                                    {
                                        Sample s5 = childs5[i5];
                                        bw.Write(s5.calls);
                                        bw.Write(s5.frameCount);
                                        bw.Write(s5.costLuaGC);
                                        bw.Write(s5.costMonoGC);
                                        WriteString(bw, s5.name);

                                        bw.Write(s5.costTime);
                                        bw.Write(s5.currentLuaMemory);
                                        bw.Write(s5.currentMonoMemory);
                                        bw.Write((ushort)s5.childs.Count);
                                        var childs6 = s5.childs;
                                        for (int i6 = 0, i6max = childs6.Count; i6 < i6max; i6++)
                                        {
                                            Sample s6 = childs6[i6];
                                            bw.Write(s6.calls);
                                            bw.Write(s6.frameCount);
                                            bw.Write(s6.costLuaGC);
                                            bw.Write(s6.costMonoGC);
                                            WriteString(bw, s6.name);

                                            bw.Write(s6.costTime);
                                            bw.Write(s6.currentLuaMemory);
                                            bw.Write(s6.currentMonoMemory);
                                            bw.Write((ushort)s6.childs.Count);
                                            var childs7 = s6.childs;
                                            for (int i7 = 0, i7max = childs7.Count; i7 < i7max; i7++)
                                            {
                                                Sample s7 = childs7[i7];
                                                bw.Write(s7.calls);
                                                bw.Write(s7.frameCount);
                                                bw.Write(s7.costLuaGC);
                                                bw.Write(s7.costMonoGC);
                                                WriteString(bw, s7.name);

                                                bw.Write(s7.costTime);
                                                bw.Write(s7.currentLuaMemory);
                                                bw.Write(s7.currentMonoMemory);
                                                bw.Write((ushort)s7.childs.Count);
                                                var childs8 = s7.childs;
                                                for (int i8 = 0, i8max = childs8.Count; i8 < i8max; i8++)
                                                {
                                                    Sample s8 = childs8[i8];
                                                    bw.Write(s8.calls);
                                                    bw.Write(s8.frameCount);
                                                    bw.Write(s8.costLuaGC);
                                                    bw.Write(s8.costMonoGC);
                                                    WriteString(bw, s8.name);

                                                    bw.Write(s8.costTime);
                                                    bw.Write(s8.currentLuaMemory);
                                                    bw.Write(s8.currentMonoMemory);
                                                    bw.Write((ushort)s8.childs.Count);
                                                    var childs9 = s8.childs;
                                                    for (int i9 = 0, i9max = childs9.Count; i9 < i9max; i9++)
                                                    {
                                                        Sample s9 = childs9[i9];
                                                        bw.Write(s9.calls);
                                                        bw.Write(s9.frameCount);
                                                        bw.Write(s9.costLuaGC);
                                                        bw.Write(s9.costMonoGC);
                                                        WriteString(bw, s9.name);

                                                        bw.Write(s9.costTime);
                                                        bw.Write(s9.currentLuaMemory);
                                                        bw.Write(s9.currentMonoMemory);
                                                        bw.Write((ushort)s9.childs.Count);
                                                        var childs10 = s9.childs;
                                                        for (int i10 = 0, i10max = childs10.Count; i10 < i10max; i10++)
                                                        {
                                                            Sample s10 = childs10[i10];
                                                            bw.Write(s10.calls);
                                                            bw.Write(s10.frameCount);
                                                            bw.Write(s10.costLuaGC);
                                                            bw.Write(s10.costMonoGC);
                                                            WriteString(bw, s10.name);

                                                            bw.Write(s10.costTime);
                                                            bw.Write(s10.currentLuaMemory);
                                                            bw.Write(s10.currentMonoMemory);
                                                            bw.Write((ushort)s10.childs.Count);
                                                            var childs11 = s10.childs;
                                                            for (int i11 = 0, i11max = childs11.Count; i11 < i11max; i11++)
                                                            {
                                                                Sample s11 = childs11[i11];
                                                                bw.Write(s11.calls);
                                                                bw.Write(s11.frameCount);
                                                                bw.Write(s11.costLuaGC);
                                                                bw.Write(s11.costMonoGC);
                                                                WriteString(bw, s11.name);

                                                                bw.Write(s11.costTime);
                                                                bw.Write(s11.currentLuaMemory);
                                                                bw.Write(s11.currentMonoMemory);
                                                                bw.Write((ushort)s11.childs.Count);
                                                                var childs12 = s11.childs;
                                                                for (int i12 = 0, i12max = childs12.Count; i12 < i12max; i12++)
                                                                {
                                                                    Sample s12 = childs12[i12];
                                                                    bw.Write(s12.calls);
                                                                    bw.Write(s12.frameCount);
                                                                    bw.Write(s12.costLuaGC);
                                                                    bw.Write(s12.costMonoGC);
                                                                    WriteString(bw, s12.name);

                                                                    bw.Write(s12.costTime);
                                                                    bw.Write(s12.currentLuaMemory);
                                                                    bw.Write(s12.currentMonoMemory);
                                                                    bw.Write((ushort)s12.childs.Count);
                                                                    var childs13 = s12.childs;
                                                                    for (int i13 = 0, i13max = childs13.Count; i13 < i13max; i13++)
                                                                    {
                                                                        Sample s13 = childs13[i13];
                                                                        bw.Write(s13.calls);
                                                                        bw.Write(s13.frameCount);
                                                                        bw.Write(s13.costLuaGC);
                                                                        bw.Write(s13.costMonoGC);
                                                                        WriteString(bw, s13.name);

                                                                        bw.Write(s13.costTime);
                                                                        bw.Write(s13.currentLuaMemory);
                                                                        bw.Write(s13.currentMonoMemory);
                                                                        bw.Write((ushort)s13.childs.Count);
                                                                        var childs14 = s13.childs;
                                                                        for (int i14 = 0, i14max = childs14.Count; i14 < i14max; i14++)
                                                                        {
                                                                            Sample s14 = childs14[i14];
                                                                            bw.Write(s14.calls);
                                                                            bw.Write(s14.frameCount);
                                                                            bw.Write(s14.costLuaGC);
                                                                            bw.Write(s14.costMonoGC);
                                                                            WriteString(bw, s14.name);

                                                                            bw.Write(s14.costTime);
                                                                            bw.Write(s14.currentLuaMemory);
                                                                            bw.Write(s14.currentMonoMemory);
                                                                            bw.Write((ushort)s14.childs.Count);
                                                                            var childs15 = s14.childs;
                                                                            for (int i15 = 0, i15max = childs15.Count; i15 < i15max; i15++)
                                                                            {
                                                                                Sample s15 = childs15[i15];
                                                                                bw.Write(s15.calls);
                                                                                bw.Write(s15.frameCount);
                                                                                bw.Write(s15.costLuaGC);
                                                                                bw.Write(s15.costMonoGC);
                                                                                WriteString(bw, s15.name);

                                                                                bw.Write(s15.costTime);
                                                                                bw.Write(s15.currentLuaMemory);
                                                                                bw.Write(s15.currentMonoMemory);
                                                                                bw.Write((ushort)s15.childs.Count);
                                                                                var childs16 = s15.childs;
                                                                                for (int i16 = 0, i16max = childs16.Count; i16 < i16max; i16++)
                                                                                {
                                                                                    Sample s16 = childs16[i16];
                                                                                    bw.Write(s16.calls);
                                                                                    bw.Write(s16.frameCount);
                                                                                    bw.Write(s16.costLuaGC);
                                                                                    bw.Write(s16.costMonoGC);
                                                                                    WriteString(bw, s16.name);

                                                                                    bw.Write(s16.costTime);
                                                                                    bw.Write(s16.currentLuaMemory);
                                                                                    bw.Write(s16.currentMonoMemory);
                                                                                    bw.Write((ushort)s16.childs.Count);
                                                                                    var childs17 = s16.childs;
                                                                                    for (int i17 = 0, i17max = childs17.Count; i17 < i17max; i17++)
                                                                                    {
                                                                                        Sample s17 = childs17[i17];
                                                                                        bw.Write(s17.calls);
                                                                                        bw.Write(s17.frameCount);
                                                                                        bw.Write(s17.costLuaGC);
                                                                                        bw.Write(s17.costMonoGC);
                                                                                        WriteString(bw, s17.name);

                                                                                        bw.Write(s17.costTime);
                                                                                        bw.Write(s17.currentLuaMemory);
                                                                                        bw.Write(s17.currentMonoMemory);
                                                                                        bw.Write((ushort)s17.childs.Count);
                                                                                        var childs18 = s17.childs;
                                                                                        for (int i18 = 0, i18max = childs18.Count; i18 < i18max; i18++)
                                                                                        {
                                                                                            Sample s18 = childs18[i18];
                                                                                            bw.Write(s18.calls);
                                                                                            bw.Write(s18.frameCount);
                                                                                            bw.Write(s18.costLuaGC);
                                                                                            bw.Write(s18.costMonoGC);
                                                                                            WriteString(bw, s18.name);

                                                                                            bw.Write(s18.costTime);
                                                                                            bw.Write(s18.currentLuaMemory);
                                                                                            bw.Write(s18.currentMonoMemory);
                                                                                            bw.Write((ushort)s18.childs.Count);
                                                                                            var childs19 = s18.childs;
                                                                                            for (int i19 = 0, i19max = childs19.Count; i19 < i19max; i19++)
                                                                                            {
                                                                                                Sample s19 = childs19[i19];
                                                                                                bw.Write(s19.calls);
                                                                                                bw.Write(s19.frameCount);
                                                                                                bw.Write(s19.costLuaGC);
                                                                                                bw.Write(s19.costMonoGC);
                                                                                                WriteString(bw, s19.name);

                                                                                                bw.Write(s19.costTime);
                                                                                                bw.Write(s19.currentLuaMemory);
                                                                                                bw.Write(s19.currentMonoMemory);
                                                                                                bw.Write((ushort)s19.childs.Count);
                                                                                                var childs20 = s19.childs;
                                                                                                for (int i20 = 0, i20max = childs20.Count; i20 < i20max; i20++)
                                                                                                {
                                                                                                    Sample s20 = childs20[i20];
                                                                                                    bw.Write(s20.calls);
                                                                                                    bw.Write(s20.frameCount);
                                                                                                    bw.Write(s20.costLuaGC);
                                                                                                    bw.Write(s20.costMonoGC);
                                                                                                    WriteString(bw, s20.name);

                                                                                                    bw.Write(s20.costTime);
                                                                                                    bw.Write(s20.currentLuaMemory);
                                                                                                    bw.Write(s20.currentMonoMemory);
                                                                                                    bw.Write((ushort)s20.childs.Count);
                                                                                                    var childs21 = s20.childs;
                                                                                                    for (int i21 = 0, i21max = childs21.Count; i21 < i21max; i21++)
                                                                                                    {
                                                                                                        Sample s21 = childs21[i21];
                                                                                                        bw.Write(s21.calls);
                                                                                                        bw.Write(s21.frameCount);
                                                                                                        bw.Write(s21.costLuaGC);
                                                                                                        bw.Write(s21.costMonoGC);
                                                                                                        WriteString(bw, s21.name);

                                                                                                        bw.Write(s21.costTime);
                                                                                                        bw.Write(s21.currentLuaMemory);
                                                                                                        bw.Write(s21.currentMonoMemory);
                                                                                                        bw.Write((ushort)s21.childs.Count);
                                                                                                        var childs22 = s21.childs;
                                                                                                        for (int i22 = 0, i22max = childs22.Count; i22 < i22max; i22++)
                                                                                                        {
                                                                                                            Sample s22 = childs22[i22];
                                                                                                            bw.Write(s22.calls);
                                                                                                            bw.Write(s22.frameCount);
                                                                                                            bw.Write(s22.costLuaGC);
                                                                                                            bw.Write(s22.costMonoGC);
                                                                                                            WriteString(bw, s22.name);

                                                                                                            bw.Write(s22.costTime);
                                                                                                            bw.Write(s22.currentLuaMemory);
                                                                                                            bw.Write(s22.currentMonoMemory);
                                                                                                            bw.Write((ushort)s22.childs.Count);
                                                                                                            var childs23 = s22.childs;
                                                                                                            for (int i23 = 0, i23max = childs23.Count; i23 < i23max; i23++)
                                                                                                            {
                                                                                                                Sample s23 = childs23[i23];
                                                                                                                bw.Write(s23.calls);
                                                                                                                bw.Write(s23.frameCount);
                                                                                                                bw.Write(s23.costLuaGC);
                                                                                                                bw.Write(s23.costMonoGC);
                                                                                                                WriteString(bw, s23.name);

                                                                                                                bw.Write(s23.costTime);
                                                                                                                bw.Write(s23.currentLuaMemory);
                                                                                                                bw.Write(s23.currentMonoMemory);
                                                                                                                bw.Write((ushort)s23.childs.Count);
                                                                                                                var childs24 = s23.childs;
                                                                                                                for (int i24 = 0, i24max = childs24.Count; i24 < i24max; i24++)
                                                                                                                {
                                                                                                                    Sample s24 = childs24[i24];
                                                                                                                    bw.Write(s24.calls);
                                                                                                                    bw.Write(s24.frameCount);
                                                                                                                    bw.Write(s24.costLuaGC);
                                                                                                                    bw.Write(s24.costMonoGC);
                                                                                                                    WriteString(bw, s24.name);

                                                                                                                    bw.Write(s24.costTime);
                                                                                                                    bw.Write(s24.currentLuaMemory);
                                                                                                                    bw.Write(s24.currentMonoMemory);
                                                                                                                    bw.Write((ushort)s24.childs.Count);
                                                                                                                    var childs25 = s24.childs;
                                                                                                                    for (int i25 = 0, i25max = childs25.Count; i25 < i25max; i25++)
                                                                                                                    {
                                                                                                                        Sample s25 = childs25[i25];
                                                                                                                        bw.Write(s25.calls);
                                                                                                                        bw.Write(s25.frameCount);
                                                                                                                        bw.Write(s25.costLuaGC);
                                                                                                                        bw.Write(s25.costMonoGC);
                                                                                                                        WriteString(bw, s25.name);

                                                                                                                        bw.Write(s25.costTime);
                                                                                                                        bw.Write(s25.currentLuaMemory);
                                                                                                                        bw.Write(s25.currentMonoMemory);
                                                                                                                        bw.Write((ushort)s25.childs.Count);
                                                                                                                        var childs26 = s25.childs;
                                                                                                                        for (int i26 = 0, i26max = childs26.Count; i26 < i26max; i26++)
                                                                                                                        {
                                                                                                                            Sample s26 = childs26[i26];
                                                                                                                            bw.Write(s26.calls);
                                                                                                                            bw.Write(s26.frameCount);
                                                                                                                            bw.Write(s26.costLuaGC);
                                                                                                                            bw.Write(s26.costMonoGC);
                                                                                                                            WriteString(bw, s26.name);

                                                                                                                            bw.Write(s26.costTime);
                                                                                                                            bw.Write(s26.currentLuaMemory);
                                                                                                                            bw.Write(s26.currentMonoMemory);
                                                                                                                            bw.Write((ushort)s26.childs.Count);
                                                                                                                            var childs27 = s26.childs;
                                                                                                                            for (int i27 = 0, i27max = childs27.Count; i27 < i27max; i27++)
                                                                                                                            {
                                                                                                                                Sample s27 = childs27[i27];
                                                                                                                                bw.Write(s27.calls);
                                                                                                                                bw.Write(s27.frameCount);
                                                                                                                                bw.Write(s27.costLuaGC);
                                                                                                                                bw.Write(s27.costMonoGC);
                                                                                                                                WriteString(bw, s27.name);

                                                                                                                                bw.Write(s27.costTime);
                                                                                                                                bw.Write(s27.currentLuaMemory);
                                                                                                                                bw.Write(s27.currentMonoMemory);
                                                                                                                                bw.Write((ushort)s27.childs.Count);
                                                                                                                                var childs28 = s27.childs;
                                                                                                                                for (int i28 = 0, i28max = childs28.Count; i28 < i28max; i28++)
                                                                                                                                {
                                                                                                                                    Sample s28 = childs28[i28];
                                                                                                                                    Serialize(s28, bw);
                                                                                                                                }
                                                                                                                            }
                                                                                                                        }
                                                                                                                    }
                                                                                                                }
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else if (o is LuaRefInfo)
            {
                LuaRefInfo r = (LuaRefInfo)o;

                bw.Write(r.cmd);
                bw.Write(Main.frameCount);
                WriteString(bw, r.name);
                WriteString(bw, r.addr);
                bw.Write(r.type);
            }
            else if (o is LuaDiffInfo)
            {
                LuaDiffInfo ld = (LuaDiffInfo)o;
                // add
                var addDict = ld.addRef;
                bw.Write(addDict.Count);
                foreach (var item in addDict)
                {
                    WriteString(bw, item.Key);
                    bw.Write((int)item.Value);
                }
                var addDetail = ld.addDetail;
                bw.Write(addDetail.Count);
                foreach (var item in addDetail)
                {
                    WriteString(bw, item.Key);
                    var list = item.Value;
                    bw.Write(list.Count);
                    foreach (var listItem in list)
                    {
                        WriteString(bw, listItem);
                    }
                }
                // rm
                var rmDict = ld.rmRef;
                bw.Write(rmDict.Count);
                foreach (var item in rmDict)
                {
                    WriteString(bw, item.Key);
                    bw.Write((int)item.Value);
                }
                var rmDetail = ld.rmDetail;
                bw.Write(rmDetail.Count);
                foreach (var item in rmDetail)
                {
                    WriteString(bw, item.Key);
                    var list = item.Value;
                    bw.Write(list.Count);
                    foreach (var listItem in list)
                    {
                        WriteString(bw, listItem);
                    }
                }

                // null
                var nullDict = ld.nullRef;
                bw.Write(nullDict.Count);
                foreach (var item in nullDict)
                {
                    WriteString(bw, item.Key);
                    bw.Write((int)item.Value);
                }
                var nullDetail = ld.nullDetail;
                bw.Write(nullDetail.Count);
                foreach (var item in nullDetail)
                {
                    WriteString(bw, item.Key);
                    var list = item.Value;
                    bw.Write(list.Count);
                    foreach (var listItem in list)
                    {
                        WriteString(bw, listItem);
                    }
                }
            }
        }