public BlittableJsonReaderObject ConvertEntityToBlittable(object entity, DocumentInfo documentInfo) { //maybe we don't need to do anything.. if (entity is BlittableJsonReaderObject blittable) { return(blittable); } if (documentInfo != null) { _session.OnBeforeConversionToDocumentInvoke(documentInfo.Id, entity); } using (DefaultRavenContractResolver.RegisterExtensionDataGetter(FillMissingProperties)) using (var writer = new BlittableJsonWriter(_session.Context, documentInfo)) { var document = ConvertEntityToBlittableInternal(entity, _session.Conventions, _session.Context, _session.JsonSerializer, writer); if (documentInfo != null) { _session.OnAfterConversionToDocumentInvoke(documentInfo.Id, entity, ref document); } return(document); } }
public BlittableJsonReaderObject ConvertEntityToBlittable(object entity, DocumentInfo documentInfo) { //maybe we don't need to do anything.. if (entity is BlittableJsonReaderObject blittable) { return(blittable); } using (DefaultRavenContractResolver.RegisterExtensionDataGetter(FillMissingProperties)) using (var writer = new BlittableJsonWriter(_session.Context, documentInfo)) { var serializer = _session.Conventions.CreateSerializer(); serializer.Serialize(writer, entity); writer.FinalizeDocument(); var reader = writer.CreateReader(); var type = entity.GetType(); var changes = TryRemoveIdentityProperty(reader, type, _session.Conventions); changes |= TrySimplifyJson(reader); if (changes) { reader = _session.Context.ReadObject(reader, "convert/entityToBlittable"); } return(reader); } }
/// <summary> /// Converts a BlittableJsonReaderObject to an entity. /// </summary> /// <param name="entityType"></param> /// <param name="id">The id.</param> /// <param name="document">The document found.</param> /// <returns>The converted entity</returns> public object ConvertToEntity(Type entityType, string id, ref BlittableJsonReaderObject document, bool trackEntity) { try { if (entityType == typeof(BlittableJsonReaderObject)) { return(document); } _session.OnBeforeConversionToEntityInvoke(id, entityType, ref document); var defaultValue = InMemoryDocumentSessionOperations.GetDefaultValue(entityType); var entity = defaultValue; ExtensionDataSetter dataSetter = null; if (trackEntity) { dataSetter = RegisterMissingProperties; } using (DefaultRavenContractResolver.RegisterExtensionDataSetter(dataSetter)) { var documentType = _session.Conventions.GetClrType(id, document); if (documentType != null) { var type = Type.GetType(documentType); if (type != null && entityType.IsAssignableFrom(type)) { entity = _session.Conventions.DeserializeEntityFromBlittable(type, document); } } if (Equals(entity, defaultValue)) { entity = _session.Conventions.DeserializeEntityFromBlittable(entityType, document); } } if (id != null) { _session.GenerateEntityIdOnTheClient.TrySetIdentity(entity, id); } _session.OnAfterConversionToEntityInvoke(id, document, entity); return(entity); } catch (Exception ex) { throw new InvalidOperationException($"Could not convert document {id} to entity of type {entityType}", ex); } }
public BlittableJsonReaderObject ConvertEntityToBlittable(object entity, DocumentInfo documentInfo) { //maybe we don't need to do anything.. if (entity is BlittableJsonReaderObject blittable) { return(blittable); } using (DefaultRavenContractResolver.RegisterExtensionDataGetter(FillMissingProperties)) using (var writer = new BlittableJsonWriter(_session.Context, documentInfo)) { return(ConvertEntityToBlittableInternal(entity, _session.Conventions, _session.Context, _session.JsonSerializer, writer)); } }
public object FromBlittable(Type type, ref BlittableJsonReaderObject json, string id, bool trackEntity) { try { if (type == typeof(BlittableJsonReaderObject)) { return(json); } _session.OnBeforeConversionToEntityInvoke(id, type, ref json); var defaultValue = InMemoryDocumentSessionOperations.GetDefaultValue(type); var entity = defaultValue; ExtensionDataSetter dataSetter = null; if (trackEntity) { dataSetter = RegisterMissingProperties; } using (DefaultRavenContractResolver.RegisterExtensionDataSetter(dataSetter)) { var documentTypeAsString = _session.Conventions.GetClrType(id, json); if (documentTypeAsString != null) { var documentType = Type.GetType(documentTypeAsString); if (documentType != null && type.IsAssignableFrom(documentType)) { entity = _session.Conventions.Serialization.DeserializeEntityFromBlittable(documentType, json); } } if (Equals(entity, defaultValue)) { entity = _session.Conventions.Serialization.DeserializeEntityFromBlittable(type, json); } } if (id != null) { _session.GenerateEntityIdOnTheClient.TrySetIdentity(entity, id); } _session.OnAfterConversionToEntityInvoke(id, json, entity); return(entity); } catch (Exception ex) { string jsonAsString = TryReadBlittableAsString(json); throw new InvalidOperationException($"Could not convert document {id} to entity of type {type}. Json: {jsonAsString}", ex); } string TryReadBlittableAsString(BlittableJsonReaderObject jsonToRead) { var jsString = string.Empty; using (var memoryStream = new MemoryStream()) { try { jsonToRead.WriteJsonToAsync(memoryStream).AsTask().ConfigureAwait(false).GetAwaiter().GetResult(); } catch { // ignore } memoryStream.Position = 0; try { using (var sr = new StreamReader(memoryStream)) { jsString = sr.ReadToEnd(); } } catch { // ignore } } return(jsString); } }