/** * Copyright 2017, Xiaomi. * All rights reserved. * Author: xiajun@xiaomi.com */ package com.xiaomi.infra.galaxy.talos.client.serialization; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import com.xiaomi.infra.galaxy.talos.client.Utils; import com.xiaomi.infra.galaxy.talos.thrift.Message; import com.xiaomi.infra.galaxy.talos.thrift.MessageType; public class MessageSerializerV3 extends MessageSerializer { private static final int MESSAGE_DATA_LENGTH_BYTES = 4; public static final int MESSAGE_HEADER_BYTES = VERSION_NUMBER_LENGTH + MESSAGE_DATA_LENGTH_BYTES; private static final MessageSerializerV3 INSTANCE = new MessageSerializerV3(); public static MessageSerializerV3 get() { return INSTANCE; } private MessageSerializerV3() { } @Override public void serialize(Message message, DataOutputStream dataOutputStream) throws IOException { // write version number; MessageSerializer.writeMessageVersion(MessageVersion.V3, dataOutputStream); // write message; byte[] messageData = Utils.serialize(message); dataOutputStream.writeInt(messageData.length); dataOutputStream.write(messageData); } @Override public Message deserialize(byte[] header, DataInputStream dataInputStream) throws IOException { int messageSize = dataInputStream.readInt(); byte[] messageData = new byte[messageSize]; dataInputStream.readFully(messageData); return Utils.deserialize(messageData, Message.class); } @Override public int getMessageSize(Message message) { try { return MESSAGE_HEADER_BYTES + Utils.serialize(message).length; } catch (Exception e) { return 0; } } }