java

쉽지만 어려운 #Java #자바 #성공적 8. Socket.io 의 Serializable(직렬화)

sieunju 2016. 6. 26. 15:16
반응형

안녕하세요 j.sieun 입니다. 


이번글에는 Socket 을 사용하면서 데이터를 임시 저장해주고 그것들을 Client 에 보내주는 

객체 직렬화(Serializable) 에 대해서 적어보겠습니다. 

직렬화(Serializable) 란? 

자바 객체를 저장하거나 전송하기 위하여 자바 객체의 코드를 다시 복원가능한 형태의 Stream으로 직렬화 시켜주는 것을 말합니다. 

제가 사용하는 프로그램중에 있는 소스중 일부를 보여드리겠습니다.

public class SocketData implements Serializable


public static final int SOCKETDATA= 10;


public static final int SOCKETLOGOUT= 20;

public static final int SOCKETSEND= 30;


private static String userName;

private static String message;

private static int state;

public SocketData (String userName, String message,int state) {

this.userNE = userName;

this.message = message;

this.state = state;

}

public static void setUserName(String user){

userName= user;

}

public static int getUserName(){

return userName;

}

}

이런식으로 자바 클래스파일을 생성하고 난후,

서버 부분에서는

public void updateData(SocketData data) {

SocketData sndData =null;

switch (data.getState()) {

case SocketData .SOCKETDATA:

//소켓 데이터를 입력하시면됩니다.

sndData = new SocketData(data.getName(),"입장", SocketData.SOCKETDATA);

broadCasting(sndData);

//그리고 클라이언트로 보내는 메소드를 입력.

break;

case SocketData .SOCKETLOGOUT:

//소켓 데이터를 입력하시면됩니다.

sndData = new SocketData(data.getName(),"로그아웃", SocketData.SOCKETLOGOUT);

broadCasting(sndData);

//그리고 클라이언트로 보내는 메소드를 입력.

break;


case SocketData .SOCKETSEND:

//소켓 데이터를 입력하시면됩니다.

sndData = new SocketData(data.getName(),"데이터전송", SocketData.SOCKETSEND);

broadCasting(sndData);

//그리고 클라이언트로 보내는 메소드를 입력.

break;

}

}


이런식으로 소스를 작성하시면 됩니다. 이것을 복사 붙여 넣기 해서 하면안되고 이해 하신후에 저 소스를 참고하시고 나서 

작성하면 됩니다. 

그리고 broadCasting(sndData); 이 의미는 클라이언트에 보내는 것을 뜻합니다.

클라이언트 쪽 소스는

public void updateData(SocketData data) {

switch (data.getState()) {

case SocketData.SOCKETDATA:

//소켓에서 저장한 데이터를 클라이언트에서 받아들이는 부분.

break;


}

간단하게 작성해보았습니다. 

이렇게 작성을 하면 소켓과 클라이언트에 데이터를 좀더 쉽게 주고 받을 수 있습니다.


이 객체 직렬화 부분은 그렇게 복잡한 메소드가 없고 단지 선언만 해주면 되는 부분이라서 사용하기 괜찮습니다. 


다른 직렬화로는 


ObjectInputStream 와 ObjectOutputStream  이 되겠습니다.


이것들에 대해서는  출처 [http://blog.naver.com/porshe99/60048101682] 

ObjectInputStream 클래스

ObjectInputStream 클래스는 파일에 저장되어 있는 객체 또는 네트워크를 통해 직렬화되어

전달된 객체를 직렬해제 하는 기능을 제공해 주고 있다.

 한가지 주의할 점은, java.io.Serializable 인터페이스와 java.io.Externalizable 인터페이스를 지원해 주는

객체에 대해서만 가능하다는 것인데, 이는 등록된(즉 Serializable 인터페이스와 Externalizable 인터페이스를

구현한 클래스 객체) 객체를 말한다. 이 때, readObject 메소드를 이용하여 스트림으로부터 직렬화된 객체를

읽을 수 있습니다. 그리고, 이렇게 읽은 객체는 배열, 문자열, 또는 각 객체 등

원래의 형으로 캐스팅 해 주어야 합니다.

 

ObjectOutputStream 클래스

ObjectOutputStream 클래스는 객체들을 출력하는 기능을 제공해 주고,

출력 스트림에 출력하기 전에 직렬화를 수행한다.

ObjectOutputStream 클래스는 자바 기본형 데이터 또는 객체들을 파일에 저장하거나 네트워크를 통해

전달하기 위해 전달할 객체를 직렬화하는 기능을 제공해 준다. 이 클래스도 역시 ObjectInputStream 클래스와

마찬가지로 java.io.Serializable 인터페이스와 java.io.Externalizable 인터페이스를 구현한 객체에 대해서만

가능하구요. 이 때, writeObject 메소드를 이용하여 스트림에 직렬화된 객체를 출력할 수 있습니다.


이 되겠습니다. 

좀더 궁금하신 사항이 있으면 댓글 또는 j.sieun73@gmail.com 메일 보내주시면 친절히 답변해드리도록 하겠습니다. 
감사합니다.





반응형