public override void DeSerialize(ArraySegment <byte> arr)
        {
            // 헤더 + 패킷ID 만큼의 공간은 외부에서 읽었을테니 비워준다.
            ushort count = 0;

            count += sizeof(ushort);
            count += sizeof(ushort);

            ReadOnlySpan <byte> span = new ReadOnlySpan <byte>(arr.Array, arr.Offset, arr.Count);

            playerId = BitConverter.ToInt64(span.Slice(count, span.Length - count));
            count   += sizeof(long);

            // string
            ushort nameLen = BitConverter.ToUInt16(span.Slice(count, span.Length - count));

            count     += sizeof(ushort);
            playerName = Encoding.Unicode.GetString(span.Slice(count, nameLen));
            count     += nameLen;

            // * 추가된 부분
            //-------------------------------------------------------------------------------
            // 리스트를 비우고, 리스트 내 요소 개수를 먼저 읽는다.
            // 해당 횟수만큼 반복하며 리스트 내 요소 단위로 데이터를 받아와서 리스트에 추가한다.
            skills.Clear();
            ushort skillLen = BitConverter.ToUInt16(span.Slice(count, span.Length - count));

            count += sizeof(ushort);
            for (int i = 0; i < skillLen; i++)
            {
                SkillInfo skill = new SkillInfo();
                skill.DeSerialize(span, ref count);
                skills.Add(skill);
            }
            //-------------------------------------------------------------------------------
        }