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 
    } 
} 

클라이언트와 서버 측에는 메시지 유형별로 등록되고 수신 메시지에서 실행되는 MessageHandler가 있습니다. 자바에서는 원시 dataypes가 객체가 아니므로 객체 또는 객체에서 원시 데이터 유형으로 변환 할 수 없기 때문에이 문제가 발생합니다. 어떤 방식 으로든 제가 이것을 성취 할 수 있습니까? 그리고 이것은 어떤 이름이나 디자인 패턴과 같은 것이 있습니다 ...

Integer, Double, ... 클래스를 사용할 수는 있지만 Integer 클래스 때문에 네트워크를 통해 더 많은 바이트를 보내야합니다. 원시 데이터 유형보다 많은 바이트의 비용이 들며 바이트의 많은 부분을 보내고 싶지 않습니다. 나는 ... 가능한 한 낮은으로

편집을 메시지 크기를 유지하고 싶은 : 내가 얘기를 깜빡 했네요, 여러 클라이언트와 하나 개의 서버가 ...

+3

주 :'@Override public void toString() {}'은 컴파일되지 않습니다. @Override가 아니면 안된다. public String toString() {}' –

+0

네, 맞아요. 그것을 지적 해 주셔서 고마워요, 직접 프로젝트에서 붙여 넣지 코드를 입력했다 ... – clzola

+3

또한 메서드 이름은 소문자로 시작해야합니다. 어쨌든 당신은 너무 일찍 최적화한다고 생각합니다. 박스형 데이터 유형을 사용하고 필요한 경우 실제 트래픽을 기반으로 최적화 할 것입니다. 프리미티브를 넘겨 주면 여전히 어떤 유형인지 알 필요가 있습니다 (0은 int, long, double 또는 값이 전혀 제공되지 않는다는 것을 어떻게 알 수 있습니까?). – NeplatnyUdaj

답변

0

U 직접 바이트로 데이터를 저장할 수있는 []에서 그런 식으로 모든 기본 데이터 형식을 Java에서 Byte로 쉽게 변환 할 수 있습니다. ByteBuffer.

대신
private object [] m_Arguments;
사용할 수 있습니다
개인 바이트 [] [] m_Arguments;
또는
private ByteBuffer [] m_Arguments;

+0

나는 +1, ByteBuffer에 객체를 저장하는 방법을 설명 할 수도 있습니다. –

+0

개체를 만드는 방법은 무엇입니까?적절한 클래스를 사용하여 객체를 캐스팅 한 다음 바이트 배열 – CoderCoder

+0

으로 변환합니다.이 방법을 사용하면 데이터를 비 직렬화하는 방법을 저장할 방법이 필요합니다. 주어진 바이트 배열이 int, 두 배 등. 래퍼 클래스를 사용하는 것보다 와이어를 통해 더 많은 정보가 전송 될 수 있습니다.하지만 이는 구현에 따라 크게 달라집니다. 아마도 JSON이나 XML 같은 데이터를 직렬화하는 다른 전략을 고려해 보셨습니까? – CodeChimp

관련 문제