Example #1
0
        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);
                }
        }
Example #2
0
        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);
                }
        }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        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));
                }
        }
Example #5
0
        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);
            }
        }