public object DeserializeValue(EventReader reader, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer) { object value; var alias = reader.Allow <AnchorAlias>(); if (alias != null) { var aliasState = state.Get <AliasState>(); ValuePromise valuePromise; if (!aliasState.TryGetValue(alias.Value, out valuePromise)) { valuePromise = new ValuePromise(alias); aliasState.Add(alias.Value, valuePromise); } return(valuePromise.HasValue ? valuePromise.Value : valuePromise); } string anchor = null; var nodeEvent = reader.Peek <NodeEvent>(); if (nodeEvent != null && !string.IsNullOrEmpty(nodeEvent.Anchor)) { anchor = nodeEvent.Anchor; } value = innerDeserializer.DeserializeValue(reader, expectedType, state, nestedObjectDeserializer); if (anchor != null) { var aliasState = state.Get <AliasState>(); ValuePromise valuePromise; if (!aliasState.TryGetValue(anchor, out valuePromise)) { aliasState.Add(anchor, new ValuePromise(value)); } else if (!valuePromise.HasValue) { valuePromise.Value = value; } else { throw new DuplicateAnchorException(alias.Start, alias.End, string.Format( "Anchor '{0}' already defined", alias.Value )); } } return(value); }
public object DeserializeValue(EventReader reader, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer) { object value; var alias = reader.Allow <AnchorAlias>(); if (alias != null) { var aliasState = state.Get <AliasState>(); if (aliasState.TryGetValue(alias.Value, out value)) { return(value); } throw new AnchorNotFoundException(alias.Start, alias.End, string.Format( "Anchor '{0}' not found", alias.Value )); } string anchor = null; var nodeEvent = reader.Peek <NodeEvent>(); if (nodeEvent != null && !string.IsNullOrEmpty(nodeEvent.Anchor)) { anchor = nodeEvent.Anchor; } value = innerDeserializer.DeserializeValue(reader, expectedType, state, nestedObjectDeserializer); if (anchor != null) { var aliasState = state.Get <AliasState>(); aliasState.Add(anchor, value); } return(value); }