예제 #1
0
        public void WriteObjectWithAnnotations(int annotationCount)
        {
            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
            {
                writer.StepIn(IonType.Struct);

                writer.SetFieldName("FieldName");
                for (var i = 0; i < annotationCount; i++)
                {
                    writer.AddTypeAnnotation($"annot_{i}");
                }

                writer.WriteString("FieldValue");

                writer.StepOut();
                writer.Flush();
            }

            var annotReader = new SaveAnnotationsReaderRoutine();
            var reader      = new UserBinaryReader(new MemoryStream(_memoryStream.GetWrittenBuffer()), annotReader);

            reader.MoveNext();
            reader.StepIn();
            reader.MoveNext();
            //load the value
            reader.StringValue();
            for (var i = 0; i < annotationCount; i++)
            {
                Assert.IsTrue(annotReader.Symbols.Contains($"annot_{i}"));
            }
        }
예제 #2
0
        public void WriteLayersDeep(int depth)
        {
            List <(string key, object value)> kvps;

            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
            {
                writer.StepIn(IonType.Struct);
                for (var i = 0; i < depth - 1; i++)
                {
                    writer.SetFieldName($"layer{i}");
                    writer.StepIn(IonType.Struct);
                }

                kvps = WriteFlat(writer);

                for (var i = 0; i < depth; i++)
                {
                    writer.StepOut();
                }

                writer.Flush();
            }

            var reader = new UserBinaryReader(new MemoryStream(_memoryStream.GetWrittenBuffer()));

            for (var i = 0; i < depth - 1; i++)
            {
                Console.WriteLine(i);
                Assert.AreEqual(IonType.Struct, reader.MoveNext());
                Console.WriteLine(reader.CurrentFieldName);
                reader.StepIn();
            }

            ReadUtils.AssertFlatStruct(reader, kvps);
        }
예제 #3
0
        public void WriteStructWithSingleBlob(int blobSize)
        {
            var blob = new byte[blobSize];

            new Random().NextBytes(blob);
            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
            {
                writer.StepIn(IonType.Struct);

                writer.SetFieldName("blob");
                writer.WriteBlob(blob);

                writer.StepOut();
                writer.Flush();
            }

            var reader = new UserBinaryReader(new MemoryStream(_memoryStream.GetWrittenBuffer()));

            reader.MoveNext();
            reader.StepIn();
            Assert.AreEqual(IonType.Blob, reader.MoveNext());
            var size = reader.GetLobByteSize();

            Assert.AreEqual(blobSize, size);
            var readBlob = new byte[size];

            reader.GetBytes(readBlob);

            Assert.IsTrue(blob.SequenceEqual(readBlob));
        }
예제 #4
0
        public void FlushAfterFinish()
        {
            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
            {
                writer.StepIn(IonType.Struct);
                writer.SetFieldName("key");
                writer.WriteString("value");
                writer.StepOut();

                writer.Finish();
                var size = _memoryStream.Length;

                writer.Flush();
                Assert.AreEqual(size + BinaryConstants.BinaryVersionMarkerLength, _memoryStream.Length);

                _memoryStream.Seek(0, SeekOrigin.Begin);
                var reader = new UserBinaryReader(_memoryStream);
                Assert.AreEqual(IonType.Struct, reader.MoveNext());
                reader.StepIn();
                Assert.AreEqual(IonType.String, reader.MoveNext());
                Assert.AreEqual("key", reader.CurrentFieldName);
                Assert.AreEqual("value", reader.StringValue());
                Assert.AreEqual(IonType.None, reader.MoveNext());
                reader.StepOut();
                //movenext() should skip over bvm
                Assert.AreEqual(IonType.None, reader.MoveNext());
            }
        }
예제 #5
0
        private static void RunOnce()
        {
            using (var stream = new MemoryStream())
            {
                using (var writer = new ManagedBinaryWriter(stream, Symbols.EmptySymbolTablesArray))
                {
                    writer.StepIn(IonType.List);
                    for (var i = 0; i < 1000; i++)
                    {
                        writer.StepIn(IonType.Struct);

                        writer.SetFieldName("boolean");
                        writer.WriteBool(true);
                        writer.SetFieldName("string");
                        writer.WriteString("this is a string");
                        writer.SetFieldName("integer");
                        writer.WriteInt(int.MaxValue);
                        writer.SetFieldName("float");
                        writer.WriteFloat(432.23123f);
                        writer.SetFieldName("timestamp");
                        writer.WriteTimestamp(new Timestamp(new DateTime(2000, 11, 11)));

                        writer.StepOut();
                    }

                    writer.StepOut();
                    writer.Flush();
                }
            }
        }
예제 #6
0
 public void WriteEmptyDatagram()
 {
     using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
     {
         writer.Flush();
         Assert.IsTrue(ReadUtils.Binary.DatagramEmpty(_memoryStream.GetWrittenBuffer()));
     }
 }
예제 #7
0
 public static byte[] Serialize(object obj, IScalarWriter scalarWriter = null)
 {
     //prepare infrastructure
     byte[] bytes = null;
     WriteObject(BinWriter, obj, scalarWriter);
     BinWriter.Flush(ref bytes);
     return(bytes);
 }
예제 #8
0
 public void WriteSingleBool(bool val)
 {
     using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
     {
         writer.WriteBool(val);
         writer.Flush();
         var bytes = _memoryStream.GetWrittenBuffer();
         Assert.AreEqual(val, ReadUtils.Binary.ReadSingleBool(bytes));
     }
 }
예제 #9
0
 public void WriteEmptyDatagram()
 {
     using (var stream = new MemoryStream())
     {
         using (var writer = new ManagedBinaryWriter(BinaryConstants.EmptySymbolTablesArray))
         {
             writer.Flush(stream);
             Assert.IsTrue(ReadUtils.Binary.DatagramEmpty(stream.ToArray()));
         }
     }
 }
예제 #10
0
 public void WriteEmptyStruct()
 {
     using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
     {
         writer.StepIn(IonType.Struct);
         writer.StepOut();
         writer.Flush();
         var reader = new UserBinaryReader(new MemoryStream(_memoryStream.GetWrittenBuffer()));
         Assert.IsTrue(reader.NextIsEmptyStruct());
     }
 }
예제 #11
0
 public void WriteSingleBool(bool val)
 {
     using (var stream = new MemoryStream())
     {
         using (var writer = new ManagedBinaryWriter(BinaryConstants.EmptySymbolTablesArray))
         {
             writer.WriteBool(val);
             writer.Flush(stream);
             var bytes = stream.ToArray();
             Assert.AreEqual(val, ReadUtils.Binary.ReadSingleBool(bytes));
         }
     }
 }
예제 #12
0
        public void WriteSingleDecimal(string format)
        {
            var val = decimal.Parse(format, System.Globalization.CultureInfo.InvariantCulture);

            Console.WriteLine(val);

            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
            {
                writer.WriteDecimal(val);
                writer.Flush();
                var bytes = _memoryStream.GetWrittenBuffer();
                Assert.AreEqual(val, ReadUtils.Binary.ReadSingleDecimal(bytes).ToDecimal());
            }
        }
예제 #13
0
 public void WriteEmptyStruct()
 {
     using (var stream = new MemoryStream())
     {
         using (var writer = new ManagedBinaryWriter(BinaryConstants.EmptySymbolTablesArray))
         {
             writer.StepIn(IonType.Struct);
             writer.StepOut();
             writer.Flush(stream);
             var reader = new UserBinaryReader(new MemoryStream(stream.ToArray()));
             Assert.IsTrue(reader.NextIsEmptyStruct());
         }
     }
 }
예제 #14
0
        public void WriteSingleDecimal(string format)
        {
            var val = decimal.Parse(format);

            Console.WriteLine(val);

            using (var writer = new ManagedBinaryWriter(BinaryConstants.EmptySymbolTablesArray))
            {
                writer.WriteDecimal(val);
                byte[] bytes = null;
                writer.Flush(ref bytes);
                Assert.AreEqual(val, ReadUtils.Binary.ReadSingleDecimal(bytes));
            }
        }
예제 #15
0
        public byte[] Serialize <T>(T obj, IScalarWriter scalarWriter = null)
        {
            using (var stream = new MemoryStream())
            {
                using (var binWriter = new ManagedBinaryWriter(stream, Symbols.EmptySymbolTablesArray))
                {
                    IonSerializationPrivate.WriteObject(binWriter, obj, scalarWriter);
                    binWriter.Flush();
                    binWriter.Finish();
                }

                return(stream.GetWrittenBuffer());
            }
        }
예제 #16
0
        public void Serialize <T>(T obj, Stream stream, IScalarWriter scalarWriter = null)
        {
            if (!stream.CanWrite)
            {
                throw new ArgumentException("Stream must be writable", nameof(stream));
            }


            using (var binWriter = new ManagedBinaryWriter(stream, Symbols.EmptySymbolTablesArray))
            {
                IonSerializationPrivate.WriteObject(binWriter, obj, scalarWriter);
                binWriter.Flush();
            }
        }
예제 #17
0
        public static byte[] Serialize <T>(T obj)
        {
            var action = IonSerializerExpression.GetAction <T>();

            // var action = GetAction<T>();
            //now write
            using (var stream = new MemoryStream())
            {
                var writer = new ManagedBinaryWriter(stream, Symbols.EmptySymbolTablesArray);
                action(obj, writer);
                writer.Flush();
                writer.Finish();
                return(stream.GetWrittenBuffer());
            }
        }
예제 #18
0
        public void WriteFlatStruct()
        {
            List <(string key, object value)> kvps;

            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
            {
                writer.StepIn(IonType.Struct);

                kvps = WriteFlat(writer);

                writer.StepOut();
                writer.Flush();
            }

            var reader = new UserBinaryReader(new MemoryStream(_memoryStream.GetWrittenBuffer()));

            ReadUtils.AssertFlatStruct(reader, kvps);
        }
예제 #19
0
        public void WriteNulls()
        {
            using (var stream = new MemoryStream())
            {
                IIonWriter writer;
                using (writer = new ManagedBinaryWriter(BinaryConstants.EmptySymbolTablesArray))
                {
                    writer.StepIn(IonType.Struct);

                    foreach (var iType in Enum.GetValues(typeof(IonType)))
                    {
                        if ((IonType)iType == IonType.Datagram || (IonType)iType == IonType.None)
                        {
                            continue;
                        }

                        var name = Enum.GetName(typeof(IonType), iType);
                        writer.SetFieldName($"null_{name}");
                        writer.WriteNull((IonType)iType);
                    }

                    writer.StepOut();
                    writer.Flush(stream);
                }

                var reader = new UserBinaryReader(new MemoryStream(stream.ToArray()));
                reader.MoveNext();
                reader.StepIn();

                foreach (var iType in Enum.GetValues(typeof(IonType)))
                {
                    if ((IonType)iType == IonType.Datagram || (IonType)iType == IonType.None)
                    {
                        continue;
                    }
                    var name = Enum.GetName(typeof(IonType), iType);
                    Assert.AreEqual((IonType)iType, reader.MoveNext());
                    Assert.AreEqual($"null_{name}", reader.CurrentFieldName);
                    Assert.IsTrue(reader.CurrentIsNull);
                }

                reader.StepOut();
            }
        }
예제 #20
0
        public void WriteFlatStruct()
        {
            using (var stream = new MemoryStream())
            {
                List <(string key, object value)> kvps;
                IIonWriter writer;
                using (writer = new ManagedBinaryWriter(BinaryConstants.EmptySymbolTablesArray))
                {
                    writer.StepIn(IonType.Struct);

                    kvps = WriteFlat(writer);

                    writer.StepOut();
                    writer.Flush(stream);
                }

                var reader = new UserBinaryReader(new MemoryStream(stream.ToArray()));
                ReadUtils.AssertFlatStruct(reader, kvps);
            }
        }
예제 #21
0
        public void WriteFloatWithForceFloatEnabledAndDisabled(double val)
        {
            int array32BitLength = 0;
            int array64BitLength = 0;

            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray, forceFloat64: false))
            {
                writer.WriteFloat(val);
                writer.Flush();
                array32BitLength = _memoryStream.GetWrittenBuffer().Length;

                _memoryStream.SetLength(0);
            }

            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray, forceFloat64: true))
            {
                writer.WriteFloat(val);
                writer.Flush();
                array64BitLength = _memoryStream.GetWrittenBuffer().Length;
            }

            Assert.AreEqual(array32BitLength + 4, array64BitLength);
        }
예제 #22
0
        public void WriteObjectWithAnnotations(int annotationCount)
        {
            using (var writer = new ManagedBinaryWriter(_memoryStream, Symbols.EmptySymbolTablesArray))
            {
                writer.StepIn(IonType.Struct);

                writer.SetFieldName("FieldName");
                for (var i = 0; i < annotationCount; i++)
                {
                    writer.AddTypeAnnotation($"annot_{i}");
                }

                writer.WriteString("FieldValue");

                writer.StepOut();
                writer.Flush();
            }

            var reader = new UserBinaryReader(new MemoryStream(_memoryStream.GetWrittenBuffer()));

            reader.MoveNext();
            reader.StepIn();
            reader.MoveNext();

            // Load the value.
            reader.StringValue();

            var annotations = reader.GetTypeAnnotationSymbols().ToList();

            Assert.AreEqual(annotations.Count, annotationCount);

            for (var i = 0; i < annotationCount; i++)
            {
                Assert.IsTrue(annotations.Any(s => s.Text == $"annot_{i}"));
            }
        }
예제 #23
0
        public void Run(string[] args)
        {
            var outputStream = new MemoryStream();

            var writer = new ManagedBinaryWriter(new ISymbolTable[0]);

            writer.StepIn(IonType.Struct);

            writer.SetFieldName("yes");
            writer.WriteBool(true);

            writer.SetFieldName("strings");
            writer.WriteString("abcd def adsd dasdas tiếng việt  😂");

            writer.SetFieldName("number_struct");
            writer.StepIn(IonType.Struct);
            writer.SetFieldName("number");
            writer.WriteInt(int.MaxValue / 2);
            writer.StepOut();

            writer.SetFieldName("float_min");
            writer.WriteFloat(float.MinValue);

            writer.SetFieldName("float_rand");
            writer.WriteFloat(float.MaxValue / 2);

            writer.SetFieldName("double_max");
            writer.WriteFloat(double.MaxValue);

            writer.SetFieldName("double_rand");
            writer.WriteFloat(3.12345678901);

            writer.StepOut();
            writer.WriteInt(int.MaxValue);
            writer.Flush(outputStream);
            writer.Dispose();

            var bytes = outputStream.ToArray();

            Console.WriteLine(bytes.Length);

            Console.WriteLine(string.Join(" ", bytes.Select(b => $"{b:X2}")));

            var reader = new UserBinaryReader(new MemoryStream(bytes));

            reader.MoveNext();
            Console.WriteLine(reader.CurrentType);
            reader.StepIn();

            reader.MoveNext();
            Console.WriteLine(reader.CurrentFieldName);
            Console.WriteLine(reader.CurrentType);
            Console.WriteLine(reader.BoolValue());
            Console.WriteLine();

            reader.MoveNext();
            Console.WriteLine(reader.CurrentFieldName);
            Console.WriteLine(reader.CurrentType);
            Console.WriteLine(reader.StringValue());
            Console.WriteLine();

            reader.MoveNext();
            Console.WriteLine(reader.CurrentFieldName);
            Console.WriteLine(reader.CurrentType);
            reader.StepIn();
            reader.MoveNext();
            Console.WriteLine(reader.CurrentFieldName);
            Console.WriteLine(reader.CurrentType);
            Console.WriteLine(reader.IntValue());
            reader.StepOut();

            reader.MoveNext();
            Console.WriteLine(reader.CurrentFieldName);
            Console.WriteLine(reader.CurrentType);
            Console.WriteLine(reader.DoubleValue());
            Console.WriteLine();

            reader.MoveNext();
            Console.WriteLine(reader.CurrentFieldName);
            Console.WriteLine(reader.CurrentType);
            Console.WriteLine(reader.DoubleValue());
            Console.WriteLine();

            reader.MoveNext();
            Console.WriteLine(reader.CurrentFieldName);
            Console.WriteLine(reader.CurrentType);
            Console.WriteLine(reader.DoubleValue());
            Console.WriteLine();

            reader.MoveNext();
            Console.WriteLine(reader.CurrentFieldName);
            Console.WriteLine(reader.CurrentType);
            Console.WriteLine(reader.DoubleValue());
            Console.WriteLine();
        }