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); } } }
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); }
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); }
public UInt32 Deserialize(byte[] bytes, UInt32 offset, UInt32 offsetLimit) { return(serializer.Deserialize(bytes, offset, offsetLimit, out instance)); }