object ISerializableSerializer.ReadValue <TInput>(ref Reader <TInput> reader, Type type, uint placeholderReferenceId) { var info = new SerializationInfo(Type, _formatterConverter); T result = default; _callbacks.OnDeserializing?.Invoke(ref result, _streamingContext); uint fieldId = 0; while (true) { var header = reader.ReadFieldHeader(); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; if (fieldId == 1) { var entry = _entrySerializer.ReadValue(ref reader, header); info.AddValue(entry.Name, entry.Value); } } _constructor(ref result, info, _streamingContext); _callbacks.OnDeserialized?.Invoke(ref result, _streamingContext); if (result is IDeserializationCallback callback) { callback.OnDeserialization(_streamingContext.Context); } return(result); }
public object ReadValue <TInput>(ref Reader <TInput> reader, Type type, uint placeholderReferenceId) { var callbacks = _serializationCallbacks.GetReferenceTypeCallbacks(type); var info = new SerializationInfo(type, _formatterConverter); var result = FormatterServices.GetUninitializedObject(type); ReferenceCodec.RecordObject(reader.Session, result, placeholderReferenceId); callbacks.OnDeserializing?.Invoke(result, _streamingContext); uint fieldId = 0; while (true) { var header = reader.ReadFieldHeader(); if (header.IsEndBaseOrEndObject) { break; } fieldId += header.FieldIdDelta; if (fieldId == 1) { var entry = _entrySerializer.ReadValue(ref reader, header); info.AddValue(entry.Name, entry.Value); } } var constructor = _constructors.GetOrAdd(info.ObjectType, _createConstructorDelegate); constructor(result, info, _streamingContext); callbacks.OnDeserialized?.Invoke(result, _streamingContext); if (result is IDeserializationCallback callback) { callback.OnDeserialization(_streamingContext.Context); } return(result); }