コード例 #1
0
        /// <summary>
        /// Resets the bulk response for re-use.
        /// </summary>
        public void Reset()
        {
            mTookProxy   = default;
            mErrorsProxy = default;

            if (Items != null)
            {
                mPool.Return(Items);
                Items = null;
            }
        }
コード例 #2
0
        /// <summary>
        /// Reads the response from specified UTF-8 JSON document and initializes the specified response.
        /// Called by <see cref="BulkResponsePool"/> to initialize the response.
        /// </summary>
        /// <param name="data">JSON document to read.</param>
        /// <returns>
        /// The created response.
        /// Call <see cref="ReturnToPool"/> to release it when you're done.
        /// </returns>
        internal void InitFromJson(byte[] data)
        {
            var    reader       = new Utf8JsonReader(data, sJsonReaderOptions);
            string propertyName = null;

            // skip the first curly brace that starts all json documents
            reader.Read();
            Debug.Assert(reader.TokenType == JsonTokenType.StartObject);

            while (reader.Read())
            {
                switch (reader.TokenType)
                {
                case JsonTokenType.PropertyName:
                {
                    propertyName = mPool.GetStringFromUtf8(reader.ValueSpan);
                    break;
                }

                case JsonTokenType.True:
                case JsonTokenType.False:
                {
                    switch (propertyName)
                    {
                    case "errors":
                        mErrorsProxy = new BooleanPropertyProxy(data, (int)reader.TokenStartIndex, reader.ValueSpan.Length);
                        break;
                    }

                    break;
                }

                case JsonTokenType.Number:
                {
                    switch (propertyName)
                    {
                    case "took":
                        mTookProxy = new Int32PropertyProxy(data, (int)reader.TokenStartIndex, reader.ValueSpan.Length);
                        break;
                    }

                    break;
                }

                case JsonTokenType.StartArray:
                {
                    switch (propertyName)
                    {
                    case "items":
                        Items = DeserializeItems(data, ref reader);
                        break;

                    default:
                        // unexpected property, skip all children!
                        reader.Skip();
                        break;
                    }

                    break;
                }

                case JsonTokenType.EndObject:
                {
                    return;
                }

                default:
                {
                    // unexpected token, skip!
                    reader.Skip();
                    break;
                }
                }
            }

            throw new ArgumentException("The reader did not deliver a closing 'EndObject'.");
        }