/// <summary> /// Provides the actual implementation for deserializing a value of type <see cref="!:T" />. /// </summary> /// <param name="value">The uninitialized value to serialize into. This value will have been created earlier using <see cref="M:OdinSerializer.BaseFormatter`1.GetUninitializedObject" />.</param> /// <param name="reader">The reader to deserialize with.</param> protected override void DeserializeImplementation(ref DoubleLookupDictionary <TPrimary, TSecondary, TValue> value, IDataReader reader) { string name; var entry = reader.PeekEntry(out name); if (entry == EntryType.StartOfArray) { try { long length; reader.EnterArray(out length); Type type; value = new DoubleLookupDictionary <TPrimary, TSecondary, TValue>(); this.RegisterReferenceID(value, reader); for (int i = 0; i < length; i++) { if (reader.PeekEntry(out name) == EntryType.EndOfArray) { reader.Context.Config.DebugContext.LogError("Reached end of array after " + i + " elements, when " + length + " elements were expected."); break; } bool exitNode = true; try { reader.EnterNode(out type); TPrimary key = PrimaryReaderWriter.ReadValue(reader); Dictionary <TSecondary, TValue> inner = InnerReaderWriter.ReadValue(reader); value.Add(key, inner); } catch (SerializationAbortException ex) { exitNode = false; throw ex; } catch (Exception ex) { reader.Context.Config.DebugContext.LogException(ex); } finally { if (exitNode) { reader.ExitNode(); } } if (reader.IsInArrayNode == false) { reader.Context.Config.DebugContext.LogError("Reading array went wrong. Data dump: " + reader.GetDataDump()); break; } } } finally { reader.ExitArray(); } } else { reader.SkipEntry(); } }