コード例 #1
0
        public override UInt32 Deserialize(Object instance, Byte[] array, UInt32 offset, UInt32 offsetLimit)
        {
            GenericArrayBuilder <ElementType> arrayBuilder = new GenericArrayBuilder <ElementType>();

            while (true)
            {
                ElementType element;
                offset = elementSerializer.Deserialize(array, offset, offsetLimit, out element);

                arrayBuilder.Add(element);
                if (isLastElementCallback(element))
                {
                    fieldInfo.SetValue(instance, arrayBuilder.Build());
                    return(offset);
                }
            }
        }
コード例 #2
0
        public override UInt32 Deserialize(Object instance, Byte[] array, UInt32 offset, UInt32 offsetLimit)
        {
            UInt32 length = array.BigEndianReadUInt32Subtype(offset, arraySizeByteCount);

            offset += arraySizeByteCount;

            if (length <= 0)
            {
                fieldInfo.SetValue(instance, null);
            }
            else
            {
                ElementType[] values = new ElementType[length];
                for (int i = 0; i < values.Length; i++)
                {
                    offset = elementSerializer.Deserialize(array, offset, offsetLimit, out values[i]);
                }
            }

            return(offset);
        }
コード例 #3
0
        public T CallBlockingTcp <T>(UInt32 procedureNumber, ISerializer requestSerializer, IInstanceSerializer <T> responseSerializer, ByteArrayReference buffer)
        {
            UInt32 transmissionID = nextTransactionID++;

            RpcMessage callMessage = new RpcMessage(transmissionID, new RpcCall(programHeader,
                                                                                procedureNumber, credentials, verifier));

            callMessage.SendTcp(socket, buffer, requestSerializer);

            UInt32     contentOffset, contentOffsetLimit;
            RpcMessage replyMessage = new RpcMessage(socket, buffer, out contentOffset, out contentOffsetLimit);

            if (replyMessage.messageType != RpcMessageType.Reply)
            {
                throw new InvalidOperationException(String.Format("Received an Rpc call from '{0}' but expected an rpc reply", socket.RemoteEndPoint));
            }

            if (replyMessage.transmissionID != transmissionID)
            {
                throw new InvalidOperationException(String.Format("Expected reply with transmission id {0} but got {1}", transmissionID, replyMessage.transmissionID));
            }

            RpcReply reply = replyMessage.reply;

            RpcCallFailedException.VerifySuccessfulReply(callMessage.call, reply);

            T      instance;
            UInt32 offset = responseSerializer.Deserialize(buffer.array, contentOffset, contentOffsetLimit, out instance);

            if (offset != contentOffsetLimit)
            {
                StringBuilder dataBuidler = new StringBuilder();
                throw new InvalidOperationException(String.Format("Deserialization of rpc message '{0}' as the following '{1}' resulted in an offset of {2}, but the record had {3} bytes",
                                                                  DataStringBuilder.DataString(reply, dataBuidler), DataStringBuilder.DataString(responseSerializer, instance, dataBuidler), offset, contentOffsetLimit));
            }

            return(instance);
        }
コード例 #4
0
 public UInt32 Deserialize(byte[] bytes, UInt32 offset, UInt32 offsetLimit)
 {
     return(serializer.Deserialize(bytes, offset, offsetLimit, out instance));
 }