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); } //------------------------------------------------------------------------------- }