Esempio n. 1
0
        public unsafe bool ReadFrom(WireType.WireTypeReader reader)
        {
            if (reader is null)
            {
                throw new System.ArgumentNullException(nameof(reader));
            }

            long size        = reader.Current.Size;
            long alreadyRead = reader.TotalRead;

            while (reader.TotalRead - alreadyRead < size)
            {
                if (!reader.Read(out WireType.TypeHeader header))
                {
                    return(false);
                }

                switch (header.Ordinal)
                {
                case 1:     // Leaves
                {
                    if (header.Kind != WireType.TypeKind.ExplicitSizeList)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out Sample.Basic[] values))
                    {
                        _Leaves.Value = values;
                    }
                }
                break;

                case 4:     // Branches
                {
                    if (header.Kind != WireType.TypeKind.ExplicitSizeList)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out Sample.Complex[] values))
                    {
                        _Branches.Value = values;
                    }
                }
                break;
                }
            }

            return(true);
        }
Esempio n. 2
0
        unsafe static void Main(string[] args)
        {
            var rand   = new Random(19770407);
            var varint = stackalloc byte[sizeof(ulong) + 2];

            int       bytes_saved   = 0;
            int       bytes_wasted  = 0;
            int       encoded_count = 0;
            Stopwatch timer         = new Stopwatch();

            timer.Start();

            for (int x = 1; x < outer_loop; x += 1)
            {
                for (int i = 1; i < inner_loop; i += 1)
                {
                    int number = x * i;

                    if (i % 2 == 0)
                    {
                        number *= -1;
                    }

                    int value = 0;

                    int written = WireType.Varint.Write(&number, varint);
                    int read    = WireType.Varint.Read(varint, &value);

                    if (written != read)
                    {
                        throw new InvalidCastException($"written != read | {written} != {read}");
                    }

                    if (number != value)
                    {
                        throw new InvalidCastException($"number != value | {number} != {value}");
                    }

                    if (written < sizeof(int))
                    {
                        bytes_saved += 1;
                    }
                    else if (written > sizeof(int))
                    {
                        bytes_wasted += 1;
                    }

                    encoded_count += 1;
                }

                for (int i = 1; i < inner_loop; i += 1)
                {
                    long number = rand.Next();

                    if (i % 3 == 0)
                    {
                        number <<= 32;
                        number  += x * i;
                    }

                    if (i % 2 == 0)
                    {
                        number *= -1;
                    }

                    long value = 0;

                    int written = WireType.Varint.Write(&number, varint);
                    int read    = WireType.Varint.Read(varint, &value);

                    if (written != read)
                    {
                        throw new InvalidCastException($"written != read | {written} != {read}");
                    }

                    if (number != value)
                    {
                        throw new InvalidCastException($"number != value | {number} != {value}");
                    }

                    if (written < sizeof(long))
                    {
                        bytes_saved += 1;
                    }
                    else if (written > sizeof(long))
                    {
                        bytes_wasted += 1;
                    }

                    encoded_count += 1;
                }

                for (int i = 1; i < inner_loop; i += 1)
                {
                    uint number = (uint)(x * i);

                    uint value = 0;

                    int written = WireType.Varint.Write(&number, varint);
                    int read    = WireType.Varint.Read(varint, &value);

                    if (written != read)
                    {
                        throw new InvalidCastException($"written != read | {written} != {read}");
                    }

                    if (number != value)
                    {
                        throw new InvalidCastException($"number != value | {number} != {value}");
                    }

                    if (written < sizeof(uint))
                    {
                        bytes_saved += 1;
                    }
                    else if (written > sizeof(uint))
                    {
                        bytes_wasted += 1;
                    }

                    encoded_count += 1;
                }

                for (int i = 1; i < inner_loop; i += 1)
                {
                    ulong number = (ulong)(x * i);

                    if (i % 2 == 0)
                    {
                        number <<= 32;
                        number  += (ulong)rand.Next();
                    }

                    ulong value = 0;

                    int written = WireType.Varint.Write(&number, varint);
                    int read    = WireType.Varint.Read(varint, &value);

                    if (written != read)
                    {
                        throw new InvalidCastException($"written != read | {written} != {read}");
                    }

                    if (number != value)
                    {
                        throw new InvalidCastException($"number != value | {number} != {value}");
                    }

                    if (written < sizeof(ulong))
                    {
                        bytes_saved += 1;
                    }
                    else if (written > sizeof(ulong))
                    {
                        bytes_wasted += 1;
                    }

                    encoded_count += 1;
                }
            }

            timer.Stop();

            Console.WriteLine($"{encoded_count:###,###,###,###} integers encoded in {timer.ElapsedMilliseconds} milliseconds.");
            Console.WriteLine($"{bytes_saved:###,###,###,###} bytes saved, {bytes_wasted:###,###,###,###} bytes wasted.");

            var complex1 = new Complex();
            var leaves   = new List <Basic>();

            for (int i = 0; i < 100; i += 1)
            {
                var leaf = new Basic();
                leaf.Enum(Values.Baz);
                leaf.Text("this is a string, persist me!");

                var floats = new float[32];

                unchecked
                {
                    for (int j = 0; j < floats.Length; j += 1)
                    {
                        floats[j] = (float)rand.NextDouble();
                    }
                }

                leaf.Values(floats);
                leaves.Add(leaf);
            }

            complex1.Leaves(leaves);

            timer.Restart();

            using (var stream = File.Open("complex.bin", FileMode.Create, FileAccess.Write, FileShare.None))
                using (var writer = new WireType.WireTypeWriter(stream))
                {
                    complex1.WriteTo(writer);
                }

            timer.Stop();

            Console.WriteLine($"{timer.ElapsedMilliseconds} milliseconds to serialize 101 messages.");

            var complex2 = new Complex();

            timer.Restart();

            using (var stream = File.Open("complex.bin", FileMode.Open, FileAccess.Read, FileShare.None))
                using (var reader = new WireType.WireTypeReader(stream))
                {
                    complex1.ReadFrom(reader);
                }

            timer.Stop();

            Console.WriteLine($"{timer.ElapsedMilliseconds} milliseconds to deserialize 101 messages.");

            Console.ReadKey();
        }
Esempio n. 3
0
        public unsafe bool ReadFrom(WireType.WireTypeReader reader)
        {
            if (reader is null)
            {
                throw new System.ArgumentNullException(nameof(reader));
            }

            long size        = reader.Current.Size;
            long alreadyRead = reader.TotalRead;

            while (reader.TotalRead - alreadyRead < size)
            {
                if (!reader.Read(out WireType.TypeHeader header))
                {
                    return(false);
                }

                switch (header.Ordinal)
                {
                case 1:     // Name
                {
                    if (header.Kind != WireType.TypeKind.ExplicitSize)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out byte[] value))
                    {
                        _Name.Value = value;
                    }
                }
                break;

                case 2:     // DoB
                {
                    if (header.Kind != WireType.TypeKind.ImplicitSize)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out long value))
                    {
                        _DoB.Value = value;
                    }
                }
                break;

                case 3:     // Len
                {
                    if (header.Kind != WireType.TypeKind.ImplicitSize)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out long value))
                    {
                        _Len.Value = value;
                    }
                }
                break;

                case 4:     // Mother
                {
                    if (header.Kind != WireType.TypeKind.ExplicitSizeList)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out Sample.More.Person[] values))
                    {
                        _Mother.Value = values;
                    }
                }
                break;

                case 7:     // Friends
                {
                    if (header.Kind != WireType.TypeKind.ExplicitSizeList)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out byte[][] values))
                    {
                        _Friends.Value = values;
                    }
                }
                break;

                case 8:     // Raw
                {
                    if (header.Kind != WireType.TypeKind.ExplicitSize)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out byte[] value))
                    {
                        _Raw.Value = value;
                    }
                }
                break;

                case 567:     // Images
                {
                    if (header.Kind != WireType.TypeKind.ExplicitSizeList)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out byte[][] values))
                    {
                        _Images.Value = values;
                    }
                }
                break;
                }
            }

            return(true);
        }
Esempio n. 4
0
        public unsafe bool ReadFrom(WireType.WireTypeReader reader)
        {
            if (reader is null)
            {
                throw new System.ArgumentNullException(nameof(reader));
            }

            long size        = reader.Current.Size;
            long alreadyRead = reader.TotalRead;

            while (reader.TotalRead - alreadyRead < size)
            {
                if (!reader.Read(out WireType.TypeHeader header))
                {
                    return(false);
                }

                switch (header.Ordinal)
                {
                case 1:     // Text
                {
                    if (header.Kind != WireType.TypeKind.ExplicitSize)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out byte[] value))
                    {
                        _Text.Value = value;
                    }
                }
                break;

                case 2:     // Value
                {
                    if (header.Kind != WireType.TypeKind.ImplicitSize)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out int value))
                    {
                        _Value.Value = value;
                    }
                }
                break;

                case 3:     // Enum
                {
                    if (header.Kind != WireType.TypeKind.ImplicitSize)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out int value))
                    {
                        _Enum.Value = (Sample.Values)value;
                    }
                }
                break;

                case 4:     // Values
                {
                    if (header.Kind != WireType.TypeKind.ImplicitSizeList)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out float[] values))
                    {
                        _Values.Value = values;
                    }
                }
                break;

                case 5:     // List
                {
                    if (header.Kind != WireType.TypeKind.ImplicitSizeList)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out ulong[] values))
                    {
                        _List.Value = values;
                    }
                }
                break;

                case 6:     // Enums
                {
                    if (header.Kind != WireType.TypeKind.ImplicitSizeList)
                    {
                        reader.Skip();
                    }

                    if (reader.Read(out int[] temp))
                    {
                        var values = new Sample.Values[temp.Length];

                        System.Buffer.BlockCopy(temp, 0, values, 0, temp.Length * sizeof(int));

                        _Enums.Value = values;
                    }
                }
                break;
                }
            }

            return(true);
        }