2014-01-06 1 views
2

Я работаю над проектом, который включает взаимодействие клиент-сервер, и они обмениваются сообщениями. Но поскольку есть разные типы сообщений, я решил создать класс Message.Java, поместив все типы данных в один массив

public class Message { 
    private String m_MessageType; 
    private Object[] m_Arguments; 

    public Message() { 

    } 

    // Have this constructor to quick add arguments to message 
    // instead calling Add method for every single argument 
    public Message(String aMessageType, Object... aArguments) { 
     // do something 
    } 

    // These methods allow to add data to message at the and of array/list 
    public void Add(int i) {} 
    public void Add(float f) {} 
    public void Add(String s) {} 
    // ... and so on for all datatypes in Java 

    // Get methods allow to retrieve data at the specific index of array/list 
    public int GetInteger(int index) { 
     return (int) m_Arguments[index]; 
    } 

    public String GetString(int index) { 
     return (String) m_Arguments[index]; 
    } 
    // ... and so on for all datatypes in Java 

    @Override 
    public String toString() { 
     // return String representation of message 
    } 
} 

На клиенте и на стороне сервера У меня есть MessageHandlers, которые зарегистрированы по типу сообщения и исполняются на сообщения за полученный. В этом вопросе у меня проблема, потому что примитивные dataypes в Java не являются объектами, и с тех пор я не могу их отличать в объекте или от объекта до примитивного типа данных. Есть ли способ, которым я могу это усвоить, и имеет ли это какое-то имя или что-то вроде шаблона проектирования ...

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

EDIT: Я забыл упомянуть, есть несколько клиентов и один сервер ...

+3

Примечание: '@Override public void toString() {}' не будет компилироваться. Это должно быть '@Override public String toString() {}' –

+0

Да, вы правы. Спасибо, что указали на это, я набирал код напрямую, не выкладывая его из проекта ... – clzola

+3

Также имена методов должны начинаться с строчных букв. В любом случае, я думаю, что вы слишком рано оптимизируете. Я бы пошел с коробчатыми типами данных и оптимизировал, основываясь на каком-то реальном трафике, если это необходимо. Если вы будете передавать примитивы, вам все равно нужно знать, какие они есть (как вы можете сказать, что 0 - это int, long, double или что значение вообще не предоставляется?). – NeplatnyUdaj

ответ

0

U можно непосредственно хранить данные как байт [] в таким образом, вы можете преобразовать все примитивные типы данных в Byte в java, легко увидеть ByteBuffer.

вместо
частный объект [] m_Arguments;
может использовать
частный байт [] [] m_Arguments;
или
частный ByteBuffer [] m_Arguments;

+0

Я дам вам +1, если вы также объясните, как вы помещаете объект в ByteBuffer. –

+0

Как вы создаете объект?лить объект с помощью соответствующего класса, а затем преобразовать его в массив байтов – CoderCoder

+0

С помощью этого подхода вам потребуется какой-то способ хранения десериализации данных, поскольку вы не знаете на другом конце, если данный массив байтов - это int, float, double и т. д. Вы можете в конечном итоге отправить больше на провод, чем если бы вы просто придерживались классов-оболочек, но это сильно зависит от реализации. Вы рассматривали другую стратегию для сериализации данных, например, JSON или XML? – CodeChimp

Смежные вопросы