예제 #1
0
        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;
            }
        }
예제 #2
0
        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);
        }