コード例 #1
0
        private void MultiSerializationRoundTrip(string json)
        {
            // Normalize the json to get rid of any formatting issues
            json = this.NewtonsoftFormat(json);

            foreach (SerializationFormat sourceFormat in Enum.GetValues(typeof(SerializationFormat)))
            {
                foreach (SerializationFormat destinationFormat in Enum.GetValues(typeof(SerializationFormat)))
                {
                    IJsonReader reader;
                    switch (sourceFormat)
                    {
                    case SerializationFormat.Text:
                        reader = JsonReader.Create(Encoding.UTF8.GetBytes(json));
                        break;

                    case SerializationFormat.Binary:
                        reader = JsonReader.Create(JsonTestUtils.ConvertTextToBinary(json));
                        break;

                    case SerializationFormat.NewtonsoftText:
                        reader = NewtonsoftToCosmosDBReader.CreateFromString(json);
                        break;

                    case SerializationFormat.BinaryWithDictionaryEncoding:
                        JsonStringDictionary jsonStringDictionary = new JsonStringDictionary(capacity: 128);
                        reader = JsonReader.Create(JsonTestUtils.ConvertTextToBinary(json, jsonStringDictionary), jsonStringDictionary);
                        break;

                    default:
                        throw new ArgumentException($"Unexpected {nameof(sourceFormat)} of type: {sourceFormat}");
                    }

                    IJsonNavigator navigator;
                    switch (sourceFormat)
                    {
                    case SerializationFormat.Text:
                        navigator = JsonNavigator.Create(Encoding.UTF8.GetBytes(json));
                        break;

                    case SerializationFormat.Binary:
                        navigator = JsonNavigator.Create(JsonTestUtils.ConvertTextToBinary(json));
                        break;

                    case SerializationFormat.NewtonsoftText:
                        navigator = new JsonNewtonsoftNavigator(json);
                        break;

                    case SerializationFormat.BinaryWithDictionaryEncoding:
                        JsonStringDictionary jsonStringDictionary = new JsonStringDictionary(capacity: 128);
                        navigator = JsonNavigator.Create(JsonTestUtils.ConvertTextToBinary(json, jsonStringDictionary), jsonStringDictionary);
                        break;

                    default:
                        throw new ArgumentException($"Unexpected {nameof(sourceFormat)} of type: {sourceFormat}");
                    }

                    object[] sources = new object[] { reader, navigator };
                    foreach (object source in sources)
                    {
                        IJsonWriter          writer;
                        JsonStringDictionary jsonStringDictionary;
                        switch (destinationFormat)
                        {
                        case SerializationFormat.Text:
                            writer = JsonWriter.Create(JsonSerializationFormat.Text);
                            jsonStringDictionary = null;
                            break;

                        case SerializationFormat.Binary:
                            writer = JsonWriter.Create(JsonSerializationFormat.Binary);
                            jsonStringDictionary = null;
                            break;

                        case SerializationFormat.NewtonsoftText:
                            writer = NewtonsoftToCosmosDBWriter.CreateTextWriter();
                            jsonStringDictionary = null;
                            break;

                        case SerializationFormat.BinaryWithDictionaryEncoding:
                            jsonStringDictionary = new JsonStringDictionary(capacity: 128);
                            writer = JsonWriter.Create(JsonSerializationFormat.Binary, jsonStringDictionary);
                            break;

                        default:
                            throw new ArgumentException($"Unexpected {nameof(destinationFormat)} of type: {destinationFormat}");
                        }

                        Stopwatch stopwatch = Stopwatch.StartNew();
                        switch (source)
                        {
                        case IJsonReader sourceReader:
                            writer.WriteAll(sourceReader);
                            break;

                        case IJsonNavigator sourceNavigator:
                            writer.WriteJsonNode(sourceNavigator, sourceNavigator.GetRootNode());
                            break;

                        default:
                            Assert.Fail("Failed to downcast source type.");
                            break;
                        }
                        stopwatch.Stop();

                        string result;
                        switch (writer.SerializationFormat)
                        {
                        case JsonSerializationFormat.Text:
                            result = Encoding.UTF8.GetString(writer.GetResult().ToArray());
                            break;

                        case JsonSerializationFormat.Binary:
                            result = JsonTestUtils.ConvertBinaryToText(writer.GetResult().ToArray(), jsonStringDictionary);
                            break;

                        default:
                            throw new ArgumentException();
                        }

                        result = this.NewtonsoftFormat(result);

                        Assert.AreEqual(json, result);
                        string sourceType = (source is IJsonReader) ? "Reader" : "Navigator";
                        Console.WriteLine($"{sourceFormat} {sourceType} to {destinationFormat} Writer took {stopwatch.ElapsedMilliseconds}ms");
                    }
                }
            }
        }
コード例 #2
0
        private static void PerformRoundTrip(
            SerializationFormat sourceFormat,
            SerializationFormat destinationFormat,
            string json)
        {
            JsonStringDictionary sourceDictionary = null;

            IJsonReader reader;

            switch (sourceFormat)
            {
            case SerializationFormat.Text:
                reader = JsonReader.Create(Encoding.UTF8.GetBytes(json));
                break;

            case SerializationFormat.Binary:
                reader = JsonReader.Create(JsonTestUtils.ConvertTextToBinary(json));
                break;

            case SerializationFormat.NewtonsoftText:
                reader = NewtonsoftToCosmosDBReader.CreateFromString(json);
                break;

            case SerializationFormat.BinaryWithDictionaryEncoding:
                sourceDictionary = new JsonStringDictionary(capacity: 128);
                reader           = JsonReader.Create(JsonTestUtils.ConvertTextToBinary(json, sourceDictionary), sourceDictionary);
                break;

            default:
                throw new ArgumentException($"Unexpected {nameof(sourceFormat)} of type: {sourceFormat}");
            }

            IJsonNavigator navigator;

            switch (sourceFormat)
            {
            case SerializationFormat.Text:
                navigator = JsonNavigator.Create(Encoding.UTF8.GetBytes(json));
                break;

            case SerializationFormat.Binary:
                navigator = JsonNavigator.Create(JsonTestUtils.ConvertTextToBinary(json));
                break;

            case SerializationFormat.NewtonsoftText:
                navigator = new JsonNewtonsoftNavigator(json);
                break;

            case SerializationFormat.BinaryWithDictionaryEncoding:
                sourceDictionary = new JsonStringDictionary(capacity: 128);
                navigator        = JsonNavigator.Create(JsonTestUtils.ConvertTextToBinary(json, sourceDictionary), sourceDictionary);
                break;

            default:
                throw new ArgumentException($"Unexpected {nameof(sourceFormat)} of type: {sourceFormat}");
            }

            object[] sources = new object[] { reader, navigator };
            foreach (object source in sources)
            {
                IJsonWriter          writer;
                JsonStringDictionary jsonStringDictionary;
                switch (destinationFormat)
                {
                case SerializationFormat.Text:
                    writer = JsonWriter.Create(JsonSerializationFormat.Text);
                    jsonStringDictionary = null;
                    break;

                case SerializationFormat.Binary:
                    writer = JsonWriter.Create(JsonSerializationFormat.Binary);
                    jsonStringDictionary = null;
                    break;

                case SerializationFormat.NewtonsoftText:
                    writer = NewtonsoftToCosmosDBWriter.CreateTextWriter();
                    jsonStringDictionary = null;
                    break;

                case SerializationFormat.BinaryWithDictionaryEncoding:
                    jsonStringDictionary = new JsonStringDictionary(capacity: 128);
                    if (sourceFormat == SerializationFormat.BinaryWithDictionaryEncoding)
                    {
                        int index = 0;
                        while (sourceDictionary.TryGetStringAtIndex(index++, out UtfAllString value))
                        {
                            Assert.IsTrue(jsonStringDictionary.TryAddString(value.Utf16String, out _));
                        }
                    }

                    writer = JsonWriter.Create(JsonSerializationFormat.Binary, jsonStringDictionary);
                    break;

                default:
                    throw new ArgumentException($"Unexpected {nameof(destinationFormat)} of type: {destinationFormat}");
                }

                switch (source)
                {
                case IJsonReader sourceReader:
                    sourceReader.WriteAll(writer);
                    break;

                case IJsonNavigator sourceNavigator:
                    sourceNavigator.WriteNode(sourceNavigator.GetRootNode(), writer);
                    break;

                default:
                    Assert.Fail("Failed to downcast source type.");
                    break;
                }

                string result;
                switch (writer.SerializationFormat)
                {
                case JsonSerializationFormat.Text:
                    result = Utf8String.UnsafeFromUtf8BytesNoValidation(writer.GetResult()).ToString();
                    break;

                case JsonSerializationFormat.Binary:
                    result = JsonTestUtils.ConvertBinaryToText(writer.GetResult(), jsonStringDictionary);
                    break;

                default:
                    throw new ArgumentException();
                }

                string normalizedResult = JsonRoundTripsTests.NewtonsoftFormat(result);
                string normalizedJson   = JsonRoundTripsTests.NewtonsoftFormat(json);

                Assert.AreEqual(normalizedJson, normalizedResult);
            }
        }