void CreateDelayedTransaction::Request::serialize(CryptoNote::ISerializer& serializer) {
  serializer(addresses, "addresses");

  if (!serializer(transfers, "transfers")) {
    throw RequestSerializationError();
  }

  serializer(changeAddress, "changeAddress");

  if (!serializer(fee, "fee")) {
    throw RequestSerializationError();
  }

  if (!serializer(anonymity, "anonymity")) {
    throw RequestSerializationError();
  }

  bool hasExtra = serializer(extra, "extra");
  bool hasPaymentId = serializer(paymentId, "paymentId");

  if (hasExtra && hasPaymentId) {
    throw RequestSerializationError();
  }

  serializer(unlockTime, "unlockTime");
}
void SendFusionTransaction::Request::serialize(CryptoNote::ISerializer& serializer) {
  if (!serializer(threshold, "threshold")) {
    throw RequestSerializationError();
  }

  if (!serializer(anonymity, "anonymity")) {
    throw RequestSerializationError();
  }

  serializer(addresses, "addresses");
  serializer(destinationAddress, "destinationAddress");
}
void GetTransactions::Request::serialize(CryptoNote::ISerializer& serializer) {
  serializer(addresses, "addresses");

  if (serializer(blockHash, "blockHash") == serializer(firstBlockIndex, "firstBlockIndex")) {
    throw RequestSerializationError();
  }

  if (!serializer(blockCount, "blockCount")) {
    throw RequestSerializationError();
  }

  serializer(paymentId, "paymentId");
}
void DeleteAddressRequest::serialize(CryptoNote::ISerializer& serializer) {
  bool r = serializer(address, "address");

  if (!r) {
    throw RequestSerializationError();
  }
}
void GetTransferRequest::serialize(CryptoNote::ISerializer& serializer) {
  bool r = serializer(transferId, "transfer_id");

  if (!r) {
    throw RequestSerializationError();
  }
}
void GetIncomingPaymentsRequest::serialize(CryptoNote::ISerializer& serializer) {
  bool r = serializer(payments, "payments");

  if (!r) {
    throw RequestSerializationError();
  }
}
void EstimateFusion::Request::serialize(CryptoNote::ISerializer& serializer) {
  if (!serializer(threshold, "threshold")) {
    throw RequestSerializationError();
  }

  serializer(addresses, "addresses");
}
void TransferDestination::serialize(CryptoNote::ISerializer& serializer) {
  bool r = serializer(amount, "amount");
  r &= serializer(address, "address");

  if (!r) {
    throw RequestSerializationError();
  }
}
void WalletRpcOrder::serialize(CryptoNote::ISerializer& serializer) {
  bool r = serializer(address, "address");
  r &= serializer(amount, "amount");

  if (!r) {
    throw RequestSerializationError();
  }
}
void GetBlockHashes::Request::serialize(CryptoNote::ISerializer& serializer) {
  bool r = serializer(firstBlockIndex, "firstBlockIndex");
  r &= serializer(blockCount, "blockCount");

  if (!r) {
    throw RequestSerializationError();
  }
}
void CreateAddress::Request::serialize(CryptoNote::ISerializer& serializer) {
  bool hasSecretKey = serializer(spendSecretKey, "spendSecretKey");
  bool hasPublicKey = serializer(spendPublicKey, "spendPublicKey");

  if (hasSecretKey && hasPublicKey) {
    //TODO: replace it with error codes
    throw RequestSerializationError();
  }
}
void SendTransactionRequest::serialize(CryptoNote::ISerializer& serializer) {
  bool r = serializer(destinations, "destinations");
  r &= serializer(fee, "fee");
  r &= serializer(mixin, "mixin");
  serializer(unlockTime, "unlock_time");
  serializer(paymentId, "payment_id");

  if (!r) {
    throw RequestSerializationError();
  }
}
void GetUnspendOuts::Request::serialize(CryptoNote::ISerializer& serializer) {
  if (!serializer(address, "address")) {
    throw RequestSerializationError();
  }

  serializer(viewKey, "viewKey");
  serializer(amount, "amount");
  serializer(mixIn, "mixIn");
  serializer(useDust, "useDust");
  serializer(dustThreshold, "dustThreshold");
}
void Export::Request::serialize(CryptoNote::ISerializer& serializer) {
  if (!serializer(fileName, "fileName")) {
    throw RequestSerializationError();
  }
}
void GetSpendKeys::Request::serialize(CryptoNote::ISerializer& serializer) {
  if (!serializer(address, "address")) {
    throw RequestSerializationError();
  }
}
void DeleteAddress::Request::serialize(CryptoNote::ISerializer& serializer) {
  if (!serializer(address, "address")) {
    throw RequestSerializationError();
  }
}
void SendDelayedTransaction::Request::serialize(CryptoNote::ISerializer& serializer) {
  if (!serializer(transactionHash, "transactionHash")) {
    throw RequestSerializationError();
  }
}
void CreateAddressList::Request::serialize(CryptoNote::ISerializer& serializer) {
  if (!serializer(spendSecretKeys, "spendSecretKeys")) {
    //TODO: replace it with error codes
    throw RequestSerializationError();
  }
}