/// <summary> /// 数据成员解析 /// </summary> /// <param name="deSerializer">XML解析器</param> /// <param name="value">目标数据</param> internal static void DeSerializeMembers(XmlDeSerializer deSerializer, ref T value) { byte * names = memberNames.Byte; DeSerializeConfig config = deSerializer.Config; MemberMap memberMap = deSerializer.MemberMap; int index = 0; if (memberMap == null) { while (deSerializer.IsName(names, ref index)) { if (index == -1) { return; } memberDeSerializers[index].Call(deSerializer, ref value); if (deSerializer.State != DeSerializeState.Success) { return; } if (deSerializer.IsNameEnd(names) == 0) { if (deSerializer.CheckNameEnd((char *)(names + (sizeof(short) + sizeof(char))), (*(short *)names >> 1) - 2) == 0) { return; } break; } ++index; names += *(short *)names + sizeof(short); } AutoCSer.StateSearcher.CharSearcher searcher = new AutoCSer.StateSearcher.CharSearcher(memberSearcher); AutoCSer.Memory.Pointer name = default(AutoCSer.Memory.Pointer); byte isTagEnd = 0; if (onUnknownName == null) { do { if ((name.Data = deSerializer.GetName(ref name.ByteSize, ref isTagEnd)) == null) { return; } if (isTagEnd == 0) { if ((index = searcher.UnsafeSearch(name.Char, name.ByteSize)) == -1) { if (deSerializer.IgnoreValue() == 0) { return; } } else if (memberDeSerializers[index].Call(deSerializer, ref value) == 0) { return; } if (deSerializer.CheckNameEnd(name.Char, name.ByteSize) == 0) { return; } } }while (true); } else { do { if ((name.Data = deSerializer.GetName(ref name.ByteSize, ref isTagEnd)) == null) { return; } if (isTagEnd == 0) { if ((index = searcher.UnsafeSearch(name.Char, name.ByteSize)) == -1) { name.ByteSize <<= 1; if (onUnknownName(deSerializer, ref value, ref name)) { if (deSerializer.State != DeSerializeState.Success) { return; } } else { if (deSerializer.State == DeSerializeState.Success) { deSerializer.State = DeSerializeState.UnknownNameError; } return; } } else if (memberDeSerializers[index].Call(deSerializer, ref value) == 0) { return; } if (deSerializer.CheckNameEnd(name.Char, name.ByteSize) == 0) { return; } } }while (true); } } else if (object.ReferenceEquals(memberMap.Type, MemberMap <T> .MemberMapType)) { memberMap.Empty(); deSerializer.MemberMap = null; while (deSerializer.IsName(names, ref index)) { if (index == -1) { return; } memberDeSerializers[index].Call(deSerializer, memberMap, ref value); if (deSerializer.State != DeSerializeState.Success) { return; } if (deSerializer.IsNameEnd(names) == 0) { if (deSerializer.CheckNameEnd((char *)(names + (sizeof(short) + sizeof(char))), (*(short *)names >> 1) - 2) == 0) { return; } break; } ++index; names += *(short *)names + sizeof(short); } AutoCSer.StateSearcher.CharSearcher searcher = new AutoCSer.StateSearcher.CharSearcher(memberSearcher); AutoCSer.Memory.Pointer name = default(AutoCSer.Memory.Pointer); byte isTagEnd = 0; try { if (onUnknownName == null) { do { if ((name.Data = deSerializer.GetName(ref name.ByteSize, ref isTagEnd)) == null) { return; } if (isTagEnd == 0) { if ((index = searcher.UnsafeSearch(name.Char, name.ByteSize)) == -1) { if (deSerializer.IgnoreValue() == 0) { return; } } else if (memberDeSerializers[index].Call(deSerializer, memberMap, ref value) == 0) { return; } if (deSerializer.CheckNameEnd(name.Char, name.ByteSize) == 0) { return; } } }while (true); } else { do { if ((name.Data = deSerializer.GetName(ref name.ByteSize, ref isTagEnd)) == null) { return; } if (isTagEnd == 0) { if ((index = searcher.UnsafeSearch(name.Char, name.ByteSize)) == -1) { name.ByteSize <<= 1; if (onUnknownName(deSerializer, ref value, ref name)) { if (deSerializer.State != DeSerializeState.Success) { return; } } else { if (deSerializer.State == DeSerializeState.Success) { deSerializer.State = DeSerializeState.UnknownNameError; } return; } } else if (memberDeSerializers[index].Call(deSerializer, memberMap, ref value) == 0) { return; } if (deSerializer.CheckNameEnd(name.Char, name.ByteSize) == 0) { return; } } }while (true); } } finally { deSerializer.MemberMap = memberMap; } } else { deSerializer.State = DeSerializeState.MemberMap; } }
/// <summary> /// 数据成员解析 /// </summary> /// <param name="jsonDeSerializer">Json解析器</param> /// <param name="value">目标数据</param> internal static void DeSerializeMembers(JsonDeSerializer jsonDeSerializer, ref T value) { #if NOJIT byte *names = memberNames.Byte; #endif DeSerializeConfig config = jsonDeSerializer.Config; MemberMap memberMap = jsonDeSerializer.MemberMap; if (memberMap == null) { #if NOJIT int index = 0; while ((names = jsonDeSerializer.IsName(names, ref index)) != null) { if (index == -1) { return; } memberDeSerializers[index].TryDeSerialize(jsonDeSerializer, ref value); if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } ++index; } #else int index = deSerializeMember(jsonDeSerializer, ref value, memberNames.Byte); if (index == -1) { return; } #endif if (index == 0 ? jsonDeSerializer.IsFirstObject() : jsonDeSerializer.IsNextObject()) { bool isQuote; if (onUnknownName == null) { do { if ((index = memberSearcher.SearchName(jsonDeSerializer, out isQuote)) != -1) { if (jsonDeSerializer.SearchColon() == 0) { return; } memberDeSerializers[index].TryDeSerialize(jsonDeSerializer, ref value); } else { if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } if (isQuote) { jsonDeSerializer.SearchStringEnd(); } else { jsonDeSerializer.SearchNameEnd(); } if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success || jsonDeSerializer.SearchColon() == 0) { return; } jsonDeSerializer.Ignore(); } }while (jsonDeSerializer.DeSerializeState == DeSerializeState.Success && jsonDeSerializer.IsNextObject()); } else { AutoCSer.Memory.Pointer name; #if !Serialize name.CurrentIndex = 0; #endif do { name.Data = jsonDeSerializer.Current; if ((index = memberSearcher.SearchName(jsonDeSerializer, out isQuote)) != -1) { if (jsonDeSerializer.SearchColon() == 0) { return; } memberDeSerializers[index].TryDeSerialize(jsonDeSerializer, ref value); } else { if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } if (isQuote) { jsonDeSerializer.SearchStringEnd(); } else { jsonDeSerializer.SearchNameEnd(); } if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } name.ByteSize = (int)((byte *)jsonDeSerializer.Current - (byte *)name.Data); if (jsonDeSerializer.SearchColon() == 0) { return; } if (isQuote) { name.Data = name.Byte + 2; name.ByteSize -= 4; } onUnknownName(jsonDeSerializer, ref value, ref name); if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } } }while (jsonDeSerializer.IsNextObject()); } } } else if (object.ReferenceEquals(memberMap.Type, MemberMap <T> .MemberMapType)) { try { memberMap.Empty(); jsonDeSerializer.MemberMap = null; #if NOJIT int index = 0; while ((names = jsonDeSerializer.IsName(names, ref index)) != null) { if (index == -1) { return; } memberDeSerializers[index].Call(jsonDeSerializer, memberMap, ref value); if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } ++index; } #else int index = deSerializeMemberMap(jsonDeSerializer, ref value, memberNames.Byte, memberMap); if (index == -1) { return; } #endif if (index == 0 ? jsonDeSerializer.IsFirstObject() : jsonDeSerializer.IsNextObject()) { bool isQuote; if (onUnknownName == null) { do { if ((index = memberSearcher.SearchName(jsonDeSerializer, out isQuote)) != -1) { if (jsonDeSerializer.SearchColon() == 0) { return; } memberDeSerializers[index].Call(jsonDeSerializer, memberMap, ref value); } else { if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } if (isQuote) { jsonDeSerializer.SearchStringEnd(); } else { jsonDeSerializer.SearchNameEnd(); } if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success || jsonDeSerializer.SearchColon() == 0) { return; } jsonDeSerializer.Ignore(); } }while (jsonDeSerializer.DeSerializeState == DeSerializeState.Success && jsonDeSerializer.IsNextObject()); } else { AutoCSer.Memory.Pointer name; #if !Serialize name.CurrentIndex = 0; #endif do { name.Data = jsonDeSerializer.Current; if ((index = memberSearcher.SearchName(jsonDeSerializer, out isQuote)) != -1) { if (jsonDeSerializer.SearchColon() == 0) { return; } memberDeSerializers[index].Call(jsonDeSerializer, memberMap, ref value); } else { if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } if (isQuote) { jsonDeSerializer.SearchStringEnd(); } else { jsonDeSerializer.SearchNameEnd(); } if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } name.ByteSize = (int)((byte *)jsonDeSerializer.Current - (byte *)name.Data); if (jsonDeSerializer.SearchColon() == 0) { return; } if (isQuote) { name.Data = name.Byte + 2; name.ByteSize -= 4; } onUnknownName(jsonDeSerializer, ref value, ref name); if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return; } } }while (jsonDeSerializer.IsNextObject()); } } } finally { jsonDeSerializer.MemberMap = memberMap; } } else { jsonDeSerializer.DeSerializeState = DeSerializeState.MemberMap; } }