繁体   English   中英

将QByteArray反序列化为Java数据类型

[英]Deserialize QByteArray to Java data types

我目前正在进行客户端 - 服务器连接。

客户端是用Java编写不使用在Android手机上运行的QT,服务器是用C ++使用Qt框架

客户临危QByteArrays, 将QStringQLists,但我不知道如何反序列化和解释进来的数据。

创建我必须在Java客户端读取数据包的C ++源代码如下所示:

QByteArray body;
QString string1, string2, string3;
QList<float> list;
qint8 recognitionCount;

QDataStream bodyStream(&body, QIODevice::WriteOnly);

bodyStream << recognitionCount;

bodyStream << string1.toUtf8()
<< string2.toUtf8()
<< string3.toUtf8()
<< list;

客户端和服务器之间的连接正常运行。 我理解如何读取服务器发送给我的整数。 我也知道如何读取字节,但我应该用这些字节做什么? 例如,如何将它们格式化为String?

谁能帮我吗?

我非常感谢任何帮助!

您可以像这样从Qt字符串转换为Java(根据此定义 ):

final static int MAX_STRING_LENGTH = 10240; // arbitrary number
private final static ByteBuffer stringBytes = ByteBuffer.allocate(MAX_STRING_LENGTH);

static String readStringFromQTStream(final ObjectInputStream in) throws IOException {
  if (in.available() < (Integer.SIZE / 8)) { // check that there are at least 4 bytes for the length
    throw new IOException("Illegal data received: expected integer but only got " + in.available() + " bytes");
  }
  final int stringLength = in.readInt();
  if (stringLength == 0xFFFFFFFF) { // Qt for null string
    return null;
  }
  if ((stringLength < 0) || (stringLength > stringBytes.capacity())) { // check for malformed data
    throw new IOException("Illegal data received: string with supposed length of " + stringLength + " bytes");
  }

  stringBytes.clear(); // global var, not thread-safe!
  in.readFully(stringBytes.array(), 0, stringLength);
  stringBytes.flip();
  return StandardCharsets.UTF_8.decode(stringBytes).toString();
}

请注意,ByteBuffer会被重用,如果您经常读取数据,这会提高性能,但如果没有其他代码,这当然不是线程安全的。

QDataStream的格式记录在http://qt-project.org/doc/qt-4.8/datastreamformat.html中 这应该告诉您需要知道将它反序列化为Java类型。

在您的服务器上,您必须知道客户端“询问”并正确回答。 在客户端也一样,你必须了解服务器的“回答”。 因此,您必须在服务器和客户端之间创建自己的“协议”。

通过线路交换的内容只是一个字节序列,而不是QByteArrayQList

QTcpSocket的API为您提供了解连接客户端所需的一切(如果应用程序应支持多个客户端,那么您的业务就可以实现)以及如何写入套接字。

在客户端将几乎相同,但我从未在Android中开发,所以无法提出任何建议。

我的回答非常简要地解释了如何在Qt中构建应用程序客户端 - 服务器。 也许可以有用。

如果有人遇到这个帖子:

我建议使用Protocol Buffers在线路上进行数据传输。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM