提交 20742180 编写于 作者: 如梦技术's avatar 如梦技术 🐛

优化 mica-mqtt-model 减少序列化长度

上级 7b57c9c7
......@@ -38,6 +38,10 @@ public enum DefaultMessageSerializer implements IMessageSerializer {
* 空 byte 数组
*/
private static final byte[] EMPTY_BYTES = new byte[0];
/**
* 空 short byte 数组,2 个长度
*/
private static final byte[] EMPTY_SHORT_BYTES = new byte[2];
/**
* 空 int byte 数组,4 个长度
*/
......@@ -52,8 +56,8 @@ public enum DefaultMessageSerializer implements IMessageSerializer {
if (message == null) {
return EMPTY_BYTES;
}
// 4 + 4 + 4 * 5 + 1 + 4 + 4 + 8 + 8
int protocolLength = 53;
// 4 + 2 + 4 * 5 + 1 + 4 + 4 + 8 + 8
int protocolLength = 51;
String fromClientId = message.getFromClientId();
// 消息来源 客户端 id
byte[] fromClientIdBytes = null;
......@@ -122,9 +126,9 @@ public enum DefaultMessageSerializer implements IMessageSerializer {
// MQTT 消息 ID
Integer messageId = message.getId();
if (messageId != null) {
buffer.putInt(messageId);
buffer.putShort(messageId.shortValue());
} else {
buffer.put(EMPTY_INT_BYTES);
buffer.put(EMPTY_SHORT_BYTES);
}
// 消息来源 客户端 id
if (fromClientIdBytes != null) {
......@@ -214,7 +218,7 @@ public enum DefaultMessageSerializer implements IMessageSerializer {
message.setNode(new String(nodeBytes, StandardCharsets.UTF_8));
}
// MQTT 消息 ID
int messageId = buffer.getInt();
int messageId = getMessageId(buffer);
if (messageId > 0) {
message.setId(messageId);
}
......@@ -302,4 +306,19 @@ public enum DefaultMessageSerializer implements IMessageSerializer {
return (short) (buffer.get() & 0xFF);
}
/**
* MessageId numberOfBytesConsumed = 2. return decoded result.
*/
private static int getMessageId(ByteBuffer buffer) {
int min = 0;
int max = 65535;
short msbSize = readUnsignedByte(buffer);
short lsbSize = readUnsignedByte(buffer);
int result = msbSize << 8 | lsbSize;
if (result < min || result > max) {
result = -1;
}
return result;
}
}
......@@ -33,7 +33,7 @@ public class DefaultMessageSerializerTest {
@Test
public void test() {
Message message = new Message();
message.setId(null);
message.setId(0xffff);
message.setFromClientId("123");
message.setFromUsername("name");
message.setClientId("123");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册