示例#1
0
        public void SuperMessageConsistencyTest()
        {
            var original = new SuperServiceMessage()
            {
                SuperMessageType =
                    SuperServiceMessage.SuperServiceMessageType.Response,
                DataBuffer = new byte[] { 0xAA, 0xBB, 0xCC }
            };

            // Serializing
            var serializer = new MessageSerializingVisitor();

            original.Accept(serializer);
            var serializedData = serializer.Result;

            Assert.NotNull(serializedData);
            Assert.True(serializedData.Length > 0);

            // Deserializing
            var deserializer = new MessageDeserializingVisitor()
            {
                DataBuffer   = serializedData,
                DataLength   = serializedData.Length,
                BufferOffset = 0
            };
            var reconstructedMessage = new SuperServiceMessage();

            reconstructedMessage.Accept(deserializer);

            Assert.AreEqual(original.SuperMessageType, reconstructedMessage.SuperMessageType);
            Assert.AreEqual(original.DataBuffer, reconstructedMessage.DataBuffer);
        }
示例#2
0
        public void Deserialize(SuperServiceMessage msg)
        {
            if (this.DataBuffer == null || this.DataBuffer.Length == 0)
            {
                throw new InvalidOperationException("DataBuffer is not set or empty");
            }

            if (this.DataBuffer.Length < this.BufferOffset + this.DataLength)
            {
                throw new InvalidOperationException("DataBuffer is too short for specified offset and data length");
            }

            try
            {
                var superMessageTypeInt = BitConverter.ToInt32(this.DataBuffer, this.BufferOffset);
                msg.SuperMessageType = (SuperServiceMessage.SuperServiceMessageType)superMessageTypeInt;
                var dataLen = BitConverter.ToInt32(this.DataBuffer, this.BufferOffset + 4);
                if (dataLen > 0)
                {
                    msg.DataBuffer = new byte[dataLen];
                    Buffer.BlockCopy(this.DataBuffer, this.BufferOffset + 8, msg.DataBuffer, 0, dataLen);
                }
                else
                {
                    msg.DataBuffer = null;
                }
            }
            catch (Exception ex)
            {
                throw new SerializationException("Exception during deserializing SuperServiceMessage", ex);
            }
        }
        public static byte[] Serialize(SuperServiceMessage msg)
        {
            var typeBytes    = BitConverter.GetBytes((int)msg.SuperMessageType);
            var dataLen      = msg.DataBuffer != null ? msg.DataBuffer.Length : 0;
            var dataLenBytes = BitConverter.GetBytes(dataLen);
            var res          = new byte[typeBytes.Length + dataLenBytes.Length + dataLen];

            Buffer.BlockCopy(typeBytes, 0, res, 0, typeBytes.Length);
            Buffer.BlockCopy(dataLenBytes, 0, res, typeBytes.Length, dataLenBytes.Length);
            if (dataLen > 0)
            {
                Buffer.BlockCopy(msg.DataBuffer, 0, res, typeBytes.Length + dataLenBytes.Length, dataLen);
            }

            return(res);
        }