java Чтение неизвестных форматов из DataInputStream

Я разрабатываю клиент-серверное приложение, которое будет обмениваться данными с использованием 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 для идентификатора типа байта.

Это, очевидно, добавит больше данных в мои пакеты, что не оптимально. Однако причина, по которой я хочу сделать это, заключается в том, чтобы избежать жесткого кодирования каждых данных, считанных для каждого, возможно, сотен пакетов.

В чем мой вопрос на самом деле, является ли это разумным способом сделать это? Или есть более простой способ отправки пакетов с пользовательской структурой и чтения их на другой стороне, не обязательно зная формат данных?


person Lex Webb    schedule 03.03.2014    source источник


Ответы (1)


Очевидно, вы должны написать токен перед каждым элементом, объявляя, какой это тип.

Или используйте ObjectOutputStream и просто пишите и читайте объекты и используйте instanceof на *получающем* конце.

person user207421    schedule 03.03.2014
comment
Это то, за что я спасибо, я закончил тем, что написал оболочку для DataOutputStream и DataInputStream, которая в основном просто делает это: public void writeByteUT(int v) throws IOException{ super.writeByte(StreamDataType.BYTE.toByte()); супер.writeByte (v); } - person Lex Webb; 04.03.2014