Я разрабатываю клиент-серверное приложение, которое будет обмениваться данными с использованием UDP и пакетов.
Я буду кодировать данные декодирования из этих пакетов, используя DataOutputStream и DataInputStream.
То, как я хотел бы хранить свои данные, находится внутри пользовательского класса пакетов, расширенного из другого пользовательского базового класса пакетов.
Этот базовый класс пакета содержит список объектов, данных пакета (эти объекты будут в нескольких форматах: String, Int, Boolean...) и будут закодированы в DataOuputStream с использованием следующего метода:
public ByteArrayOutputStream getDataOS(){
ByteArrayOutputStream data = new ByteArrayOutputStream();
DataOutputStream os = new DataOutputStream(data);
try {
for(Object obj : packetData){
if(obj instanceof String)
os.writeUTF((String) obj);
else if(obj instanceof Integer)
os.writeInt((int) obj);
else if(obj instanceof Byte)
os.writeByte((Byte) obj);
else if(obj instanceof Double)
os.writeDouble((double) obj);
else if(obj instanceof Boolean)
os.writeBoolean((Boolean) obj);
}
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
Затем этот ByteArrayOutputStream будет отправлен моему обработчику пакетов и перенаправлен клиенту/серверу.
Дорожный блок, с которым я столкнулся, касается того, как читать эти пакеты DataInputStream на другом конце.
Поскольку я не буду знать, в каком формате будет каждый из объектов, я не смогу прочитать их с помощью is.readUTF(); Например.
Один из способов, который я придумал для борьбы с этим, - отправить идентификатор типа байтового объекта перед каждым отправленным объектом. То есть int будет 0, UTF будет 1 и так далее. Это позволило бы мне подготовиться к прочтению каждого объекта, используя оператор case для идентификатора типа байта.
Это, очевидно, добавит больше данных в мои пакеты, что не оптимально. Однако причина, по которой я хочу сделать это, заключается в том, чтобы избежать жесткого кодирования каждых данных, считанных для каждого, возможно, сотен пакетов.
В чем мой вопрос на самом деле, является ли это разумным способом сделать это? Или есть более простой способ отправки пакетов с пользовательской структурой и чтения их на другой стороне, не обязательно зная формат данных?