public object EntityFromJsonStream(Type type, BlittableJsonReaderObject jsonObject)
        {
            if (_reader == null)
            {
                _reader = new BlittableJsonReader();
            }
            if (_serializer == null ||
                _conventions.CustomizeJsonSerializer != _customize)
            {
                // we need to keep track and see if the event has been changed,
                // if so, we'll need a new instance of the serializer
                _customize  = _conventions.CustomizeJsonSerializer;
                _serializer = _conventions.CreateSerializer();
            }

            _reader.Init(jsonObject);
            using (DefaultRavenContractResolver.RegisterExtensionDataSetter((o, key, value) =>
            {
                JToken id;
                if (key == Constants.Documents.Metadata.Key && value is JObject json)
                {
                    if (json.TryGetValue(Constants.Documents.Metadata.Id, out id))
                    {
                        if (_generateEntityIdOnTheClient.TryGetIdFromInstance(o, out var existing) &&
                            existing != null)
                        {
                            return;
                        }
                        _generateEntityIdOnTheClient.TrySetIdentity(o, id.Value <string>());
                    }
                }

                if (key == Constants.Documents.Metadata.Id)
                {
                    id = value as JToken;
                    if (id == null)
                    {
                        return;
                    }

                    if (_generateEntityIdOnTheClient.TryGetIdFromInstance(o, out var existing) &&
                        existing != null)
                    {
                        return;
                    }
                    _generateEntityIdOnTheClient.TrySetIdentity(o, id.Value <string>());
                }
            }))
            {
                return(_serializer.Deserialize(_reader, type));
            }
        }
        public object EntityFromJsonStream(Type type, BlittableJsonReaderObject jsonObject)
        {
            _reader.Value.Init(jsonObject);

            using (DefaultRavenContractResolver.RegisterExtensionDataSetter((o, key, value) =>
            {
                JToken id;
                if (key == Constants.Documents.Metadata.Key && value is JObject json)
                {
                    if (json.TryGetValue(Constants.Documents.Metadata.Id, out id))
                    {
                        if (_generateEntityIdOnTheClient.TryGetIdFromInstance(o, out var existing) &&
                            existing != null)
                        {
                            return;
                        }

                        var isProjection = json.TryGetValue(Constants.Documents.Metadata.Projection, out var projection) &&
                                           projection.Type == JTokenType.Boolean &&
                                           projection.Value <bool>();

                        _generateEntityIdOnTheClient.TrySetIdentity(o, id.Value <string>(), isProjection);
                    }
                }

                if (key == Constants.Documents.Metadata.Id)
                {
                    id = value as JToken;
                    if (id == null)
                    {
                        return;
                    }

                    if (_generateEntityIdOnTheClient.TryGetIdFromInstance(o, out var existing) &&
                        existing != null)
                    {
                        return;
                    }
                    _generateEntityIdOnTheClient.TrySetIdentity(o, id.Value <string>());
                }
            }))
            {
                return(_deserializer.Value.Deserialize(_reader.Value, type));
            }
        }
Пример #3
0
        private string GetId(object entity)
        {
            if (_generateEntityIdOnTheClient.TryGetIdFromInstance(entity, out var id))
            {
                return(id);
            }

            id = _generateEntityIdOnTheClient.GenerateDocumentIdForStorage(entity);
            _generateEntityIdOnTheClient.TrySetIdentity(entity, id); //set Id property if it was null
            return(id);
        }
 private async Task<DocumentMetadata> GetDocumentMetadataAsync<T>(T instance)
 {
     DocumentMetadata value;
     if (entitiesAndMetadata.TryGetValue(instance, out value) == false)
     {
         string id;
         if (GenerateEntityIdOnTheClient.TryGetIdFromInstance(instance, out id)
             || (instance is IDynamicMetaObjectProvider &&
                GenerateEntityIdOnTheClient.TryGetIdFromDynamic(instance, out id)))
         {
             AssertNoNonUniqueInstance(instance, id);
             var jsonDocument = await GetJsonDocumentAsync(id).ConfigureAwait(false);
             value = GetDocumentMetadataValue(instance, id, jsonDocument);
         }
         else
         {
             throw new InvalidOperationException("Could not find the document key for " + instance);
         }
     }
     return value;
 }