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

时间:2013-11-13 23:27:49

标签: java c++ qt deserialization qbytearray

我目前正在开发客户端 - 服务器连接。

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

客户端收到QByteArrays QStrings QLists ,但我不知道如何反序列化和解释收到的数据。

创建我必须在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?

任何人都可以帮助我吗?

我真的很感激任何帮助!

4 个答案:

答案 0 :(得分:2)

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

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会被重用,如果您经常读取数据,这会提高性能,但如果没有其他代码,这当然不是线程安全的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

QTcpSocket 的API为您提供了解连接客户端所需的一切(如果应用程序应该支持多个客户端是您的业务使其成为可能)以及如何写入插座。

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

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

答案 3 :(得分:0)

如果有人遇到这个帖子:

我建议使用Protocol Buffers代替电话进行数据传输。