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);
        }
Пример #4
0
        protected string ModifyObjectId(string id, object entity, RavenJObject metadata)
        {
            var shardId = shardStrategy.ShardResolutionStrategy.GenerateShardIdFor(entity, this);

            if (string.IsNullOrEmpty(shardId))
            {
                throw new InvalidOperationException("Could not find shard id for " + entity + " because " + shardStrategy.ShardAccessStrategy + " returned null or empty string for the document shard id.");
            }
            metadata[Constants.RavenShardId] = shardId;
            var modifyDocumentId = shardStrategy.ModifyDocumentId(Conventions, shardId, id);

            if (modifyDocumentId != id)
            {
                GenerateEntityIdOnTheClient.TrySetIdentity(entity, modifyDocumentId);
            }

            return(modifyDocumentId);
        }