private void WriteData(IStreamWriter writer, TypeCode dataTypeCd, object data) { switch (dataTypeCd) { case TypeCode.Boolean: writer.Write((bool)data); break; case TypeCode.Byte: writer.Write((byte)data); break; case TypeCode.Char: writer.Write((char)data); break; case TypeCode.DateTime: writer.Write(((DateTime)data).Ticks); break; case TypeCode.DBNull: writer.Write(NullFlag); break; case TypeCode.Decimal: writer.Write((decimal)data); break; case TypeCode.Double: writer.Write((double)data); break; case TypeCode.Empty: writer.Write(NullFlag); break; case TypeCode.Int16: writer.Write((short)data); break; case TypeCode.Int32: writer.Write((int)data); break; case TypeCode.Int64: writer.Write((long)data); break; case TypeCode.SByte: writer.Write((sbyte)data); break; case TypeCode.Single: writer.Write((float)data); break; case TypeCode.String: WriteString(writer, (string)data); break; case TypeCode.UInt16: writer.Write((ushort)data); break; case TypeCode.UInt32: writer.Write((uint)data); break; case TypeCode.UInt64: writer.Write((ulong)data); break; default: { using (var dataStream = new ChunkedStream()) { GetSerializer().Serialize(data, dataStream); writer.Write((int)dataStream.Length); dataStream.Position = 0; dataStream.CopyTo(writer.BaseStream); } } break; } }
private void Write(IStreamWriter writer, WireMessage message) { if (message is null) { writer.Write(NullFlag); return; } var dataTypeCd = Type.GetTypeCode(message.Data?.GetType()); var buffer = WireBufferCache.Acquire(); try { buffer[WireMessageBufferOffsetOf.DataTypeCd] = (byte)(NotNullFlag + dataTypeCd); buffer[WireMessageBufferOffsetOf.MessageType] = (byte)message.MessageType; buffer[WireMessageBufferOffsetOf.State] = (byte)message.State; Array.Copy((message.TimeoutMSec ?? int.MinValue).ToBytes(), 0, buffer, WireMessageBufferOffsetOf.TimeoutMSec, WireMessageFieldSizeOf.TimeoutMSec); var id = (message.Id ?? WireMessageId.Empty); Array.Copy(id.Major.ToBytes(), 0, buffer, WireMessageBufferOffsetOf.IdMajor, WireMessageFieldSizeOf.IdMajor); Array.Copy(id.MajorRevision.ToBytes(), 0, buffer, WireMessageBufferOffsetOf.IdMajorRevision, WireMessageFieldSizeOf.IdMajorRevision); Array.Copy(id.Minor.ToBytes(), 0, buffer, WireMessageBufferOffsetOf.IdMinor, WireMessageFieldSizeOf.IdMinor); Array.Copy(id.MinorRevision.ToBytes(), 0, buffer, WireMessageBufferOffsetOf.IdMinorRevision, WireMessageFieldSizeOf.IdMinorRevision); Array.Copy(id.ProcessId.ToBytes(), 0, buffer, WireMessageBufferOffsetOf.IdProcessId, WireMessageFieldSizeOf.IdProcessId); writer.Write(buffer, 0, WireMessageSizeOf.ConstantFields); } finally { WireBufferCache.Release(buffer); } WriteString(writer, message.From?.ToString()); WriteString(writer, message.To?.ToString()); var header = message.Header; if (header == null) { writer.Write(NullFlag); } else { writer.Write(NotNullFlag); writer.Write(header.Count); foreach (var kv in header) { WriteString(writer, kv.Key); WriteString(writer, kv.Value); } } if (message.Exception is null) { writer.Write(NullFlag); } else { writer.Write(NotNullFlag); using (var dataStream = new ChunkedStream()) { GetSerializer().Serialize(message.Exception, dataStream); writer.Write((int)dataStream.Length); dataStream.Position = 0; dataStream.CopyTo(writer.BaseStream); } } WriteData(writer, dataTypeCd, message.Data); }