示例#1
0
        public void CanWriteMessageSetData()
        {
            using (var ms = new MemoryStream())
            {
                using (var writer = ProtoWriter.Create(ms, null, null))
                {
                    ProtoWriter.WriteFieldHeader(5, WireType.String, writer);
                    var tok = ProtoWriter.StartSubItem(null, writer);

                    ProtoWriter.WriteFieldHeader(1, WireType.StartGroup, writer);
                    var tok2 = ProtoWriter.StartSubItem(null, writer);

                    ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer);
                    ProtoWriter.WriteInt32(15447542, writer);

                    ProtoWriter.WriteFieldHeader(3, WireType.String, writer);
                    var tok3 = ProtoWriter.StartSubItem(null, writer);

                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString("EmbeddedMessageSetElement", writer);

                    ProtoWriter.EndSubItem(tok3, writer);
                    ProtoWriter.EndSubItem(tok2, writer);

                    ProtoWriter.EndSubItem(tok, writer);
                }

                var hex = BitConverter.ToString(ms.ToArray(), 0, (int)ms.Length);
                Assert.Equal("2A-24-0B-10-F6-EB-AE-07-1A-1B-0A-19"
                             + "-45-6D-62-65-64-64-65-64-4D-65-73-73-61-67-65-53"
                             + "-65-74-45-6C-65-6D-65-6E-74-0C", hex);
            }
        }
示例#2
0
 /// <summary>
 /// Writes the body of an object in the output
 /// </summary>
 public override void WriteObjectContent(XmlDictionaryWriter writer, object graph)
 {
     if (writer == null)
     {
         throw new ArgumentNullException(nameof(writer));
     }
     if (graph == null)
     {
         writer.WriteAttributeString("nil", "true");
     }
     else
     {
         using (MemoryStream ms = new MemoryStream())
         {
             if (isList)
             {
                 model.Serialize(ms, graph, null);
             }
             else
             {
                 using (ProtoWriter protoWriter = ProtoWriter.Create(ms, model, null))
                 {
                     model.Serialize(key, graph, protoWriter);
                 }
             }
             byte[] buffer = ms.GetBuffer();
             writer.WriteBase64(buffer, 0, (int)ms.Length);
         }
     }
 }
            public void ShouldAcceptTrailingFieldHeaders()
            {
                // Arrange
                var stream = new MemoryStream();

                using (var writer = ProtoWriter.Create(stream, null, null))
                {
                    ProtoWriter.WriteFieldHeader(1, WireType.StartGroup, writer);

                    var resultToken = ProtoWriter.StartSubItem(0, writer);

                    ProtoWriter.WriteFieldHeader(2, WireType.StartGroup, writer);

                    var columnToken = ProtoWriter.StartSubItem(1, writer);

                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString("foo", writer);
                    ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer);
                    ProtoWriter.WriteInt32((int)1, writer);
                    ProtoWriter.WriteFieldHeader(42, WireType.String, writer);
                    ProtoWriter.WriteString("bar", writer);

                    ProtoWriter.EndSubItem(columnToken, writer);

                    ProtoWriter.EndSubItem(resultToken, writer);
                }

                stream.Position = 0;

                // Assert
                new ProtoDataReader(stream);
            }
            public void ShouldThrowExceptionOnColumnTypeInvalidFieldHeader()
            {
                // Arrange
                var stream = new MemoryStream();

                using (var writer = ProtoWriter.Create(stream, null, null))
                {
                    ProtoWriter.WriteFieldHeader(1, WireType.StartGroup, writer);

                    var resultToken = ProtoWriter.StartSubItem(0, writer);

                    ProtoWriter.WriteFieldHeader(2, WireType.StartGroup, writer);

                    var columnToken = ProtoWriter.StartSubItem(1, writer);

                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString("foo", writer);
                    ProtoWriter.WriteFieldHeader(42, WireType.Variant, writer);
                    ProtoWriter.WriteInt32((int)1, writer);

                    ProtoWriter.EndSubItem(columnToken, writer);

                    ProtoWriter.EndSubItem(resultToken, writer);
                }

                stream.Position = 0;

                // Assert
                Assert.Throws <InvalidDataException>(() => new ProtoDataReader(stream));
            }
示例#5
0
        public void OnNext(TableUpdate value)
        {
            // TODO: Find way to re-utilise the proto writers (object pool?)
            using (var writer = ProtoWriter.Create(_outputStream, null, null))
            {
                var outerToken = new SubItemToken();
                if (WithLengthPrefix)
                {
                    // Encode the length of the stream (protobuf-net will automatically calculate the length of the 'String' field)
                    ProtoWriter.WriteFieldHeader(ProtobufOperationTypes.MessageSize, WireType.String, writer);
                    outerToken = ProtoWriter.StartSubItem(ProtobufOperationTypes.MessageSize, writer);
                }
                switch (value.Action)
                {
                case TableUpdateAction.Add:
                    WriteAdd(writer, value);
                    WriteUpdates(writer, _table.Columns, value.RowIndex);
                    break;

                case TableUpdateAction.Update:
                    WriteUpdate(writer, value.Column, value.RowIndex);
                    break;

                case TableUpdateAction.Delete:
                    WriteDelete(writer, value);
                    break;
                }
                if (WithLengthPrefix)
                {
                    ProtoWriter.EndSubItem(outerToken, writer);
                }
            }
        }
示例#6
0
 public static void Test(Action <ProtoWriter> action, string expectedHex)
 {
     using (var ms = new MemoryStream())
     {
         using (var pw = ProtoWriter.Create(ms, RuntimeTypeModel.Default, null))
         {
             action(pw);
         }
         string s = GetHex(ms.ToArray());
         Assert.Equal(expectedHex, s);
     }
 }
示例#7
0
            public void ShouldThrowExceptionOnInvalidFieldHeader()
            {
                // Arrange
                var stream = new MemoryStream();

                using (var writer = ProtoWriter.Create(stream, null, null))
                {
                    ProtoWriter.WriteFieldHeader(42, WireType.StartGroup, writer);
                }

                stream.Position = 0;

                // Assert
                Assert.Throws <InvalidDataException>(() => new ProtoDataReader(stream));
            }
示例#8
0
        byte[] Serialize(TypeModel model, object value)
        {
            Type type = value.GetType();
            int  key  = model.GetKey(ref type);

            using (MemoryStream ms = new MemoryStream())
            {
                using (ProtoWriter writer = ProtoWriter.Create(ms, model, null))
                {
                    writer.SetRootObject(value);
                    model.Serialize(key, value, writer);
                    writer.Close();

                    return(ms.ToArray());
                }
            }
        }
        private void MemoryStream_ViaWriter(TypeModel model)
        {
            using var buffer = new MemoryStream();
            for (int i = 0; i < OperationsPerInvoke; i++)
            {
#pragma warning disable CS0618
                using (var writer = ProtoWriter.Create(buffer, model))
                {
                    model.Serialize(writer, _database);
                    writer.Close();
                }
#pragma warning restore CS0618
                AssertLength(buffer.Length);
                buffer.Position = 0;
                buffer.SetLength(0);
            }
        }
        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="value">值</param>
        /// <param name="order">序号</param>
        /// <returns></returns>
        public static byte[] GetData(uint value, int order)
        {
            using (var ms = new MemoryStream())
            {
                var writer = ProtoWriter.Create(ms, _typeModel);

                // 写入数据
                ProtoWriter.WriteFieldHeader(order, WireType.Variant, writer);
                ProtoWriter.WriteUInt32(value, writer);

                // 释放缓冲区
                writer.Close();

                ms.Position = 0;
                var data = ms.ToArray();

                return(data);
            }
        }
        static ProtoReader GetReader()
        {
            var model = TypeModel.Create();

            model.Add(typeof(Foo), true);
            model.CompileInPlace();

            var ms  = new MemoryStream();
            var obj = new Foo {
                Bar = "abc", Blap = "abc"
            };

            using (var writer = ProtoWriter.Create(ms, model, null))
            {
                writer.Model.Serialize(writer, obj);
            }
            ms.Position = 0;

            return(ProtoReader.Create(ms, model, null));
        }
        /// <summary>
        /// Serialize an <see cref="System.Data.IDataReader"/> to a binary stream using protocol-buffers.
        /// </summary>
        /// <param name="stream">The <see cref="System.IO.Stream"/> to write to.</param>
        /// <param name="reader">The <see cref="System.Data.IDataReader"/>who's contents to serialize.</param>
        /// <param name="options"><see cref="ProtoDataWriterOptions"/> specifying any custom serialization options.</param>
        public void Serialize(Stream stream, IDataReader reader, ProtoDataWriterOptions options)
        {
            Throw.IfNull(stream, nameof(stream));
            Throw.IfNull(reader, nameof(reader));

            options = options ?? new ProtoDataWriterOptions();

            var resultIndex = 0;

            using (var writer = ProtoWriter.Create(stream, null, null))
            {
                var context = new ProtoWriterContext(writer, options);

                do
                {
                    ProtoWriter.WriteFieldHeader(1, WireType.StartGroup, writer);

                    context.StartSubItem(resultIndex);

                    context.Columns = ProtoDataColumnFactory.GetColumns(reader, options);

                    ColumnsWriter.WriteColumns(context);

                    var recordIndex = 0;

                    while (reader.Read())
                    {
                        RecordWriter.WriteRecord(context, recordIndex, reader);

                        recordIndex++;
                    }

                    context.EndSubItem();

                    resultIndex++;
                }while (reader.NextResult());
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ProtoDataStream"/> class.
        /// </summary>
        /// <param name="reader">The <see cref="IDataReader"/>who's contents to serialize.</param>
        /// <param name="options"><see cref="ProtoDataWriterOptions"/> specifying any custom serialization options.</param>
        /// <param name="bufferSize">Buffer size to use when serializing rows.
        /// You should not need to change this unless you have exceptionally
        /// large rows or an exceptionally high number of columns.</param>
        public ProtoDataStream(
            IDataReader reader,
            ProtoDataWriterOptions options,
            int bufferSize = DefaultBufferSize)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            if (options == null)
            {
                throw new ArgumentNullException("options");
            }

            this.reader  = reader;
            this.options = options;

            this.resultIndex  = 0;
            this.bufferStream = new CircularStream(bufferSize);
            this.writer       = ProtoWriter.Create(this.bufferStream, null, null);
            this.context      = new ProtoWriterContext(this.writer, this.options);
        }
        public void CheckPerformanceNotInsanelyBad()
        {
            var model = TypeModel.Create();

            model.Add(typeof(PropsViaDictionaryDefault), true);
            model.Add(typeof(PropsViaDictionaryGrouped), true);
            model.Add(typeof(PropsViaProperties), true);
            model.CompileInPlace();
            var o1 = new PropsViaProperties {
                Field1 = 123, Field2 = 456, Field3 = 789
            };

            var o2 = new PropsViaDictionaryDefault()
            {
                Values = new List <KeyValuePair> {
                    new KeyValuePair {
                        Key = "Field1", Value = 123
                    },
                    new KeyValuePair {
                        Key = "Field2", Value = 456
                    },
                    new KeyValuePair {
                        Key = "Field2", Value = 789
                    },
                }
            };
            var o3 = new PropsViaDictionaryGrouped()
            {
                Values = new List <KeyValuePair> {
                    new KeyValuePair {
                        Key = "Field1", Value = 123
                    },
                    new KeyValuePair {
                        Key = "Field2", Value = 456
                    },
                    new KeyValuePair {
                        Key = "Field2", Value = 789
                    },
                }
            };


            int l1 = BulkTest(model, o1, out int s1, out int d1);
            int l2 = BulkTest(model, o2, out int s2, out int d2);
            int l3 = BulkTest(model, o2, out int s3, out int d3);

            Console.WriteLine("Bytes (props)\t" + l1);
            Console.WriteLine("Ser (props)\t" + s1);
            Console.WriteLine("Deser (props)\t" + d1);
            Console.WriteLine("Bytes (kv-default)\t" + l2);
            Console.WriteLine("Ser (kv-default)\t" + s2);
            Console.WriteLine("Deser (kv-default)\t" + d2);
            Console.WriteLine("Bytes (kv-grouped)\t" + l3);
            Console.WriteLine("Ser (kv-grouped)\t" + s3);
            Console.WriteLine("Deser (kv-grouped)\t" + d3);

            var       pw    = ProtoWriter.Create(Stream.Null, null, null);
            Stopwatch watch = Stopwatch.StartNew();

            for (int i = 0; i < LOOP; i++)
            {
                ProtoWriter.WriteFieldHeader(1, WireType.String, pw);
                ProtoWriter.WriteString("Field1", pw);
                ProtoWriter.WriteFieldHeader(1, WireType.String, pw);
                ProtoWriter.WriteString("Field2", pw);
                ProtoWriter.WriteFieldHeader(1, WireType.String, pw);
                ProtoWriter.WriteString("Field3", pw);
            }
            watch.Stop();
            pw.Close();
            Console.WriteLine("Encoding: " + watch.ElapsedMilliseconds);
        }