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); } }
/// <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)); }
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); } } }
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); } }
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)); }
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); }