2011-08-14 4 views
2

모든 통신에 소켓을 사용하는 간단한 클라이언트/서버 응용 프로그램에서 작업하고 있습니다. 통신은 패킷 기반이며 패킷 개념은 클래스 집합과 소켓 스트림에 대한/ObjectOutputStream 래퍼를 사용하여 구현됩니다.ObjectInputStream/ObjectOutputStream을 사용하여 Java "네트워크"네트워크 구현에 대한 장단점은 무엇입니까?

이 접근 방식은 전체 텍스트 기반 프로토콜 (IRC와 같은) 또는 "바이너리"항목 (바이트로 명시 적으로 작업)과 비교할 때 단점이 있는지 궁금합니다.

여기 트래픽 문제 ("qwerty"대 "qwerty"+ 메타 데이터 1KB)를 무시하고 안정성 및 유지 관리 가능성 만 고려해 보겠습니다.

당신은 어떻게 생각하십니까?

답변

5

개인적으로 나는 Java에 내장 된 이진 직렬화가 엄청나게 고통 스럽다는 것을 발견했습니다. 그것은 ludicrously 당신이 무엇이든을 변경하지 않았더라도 버전 비 호환성으로 끝나기가 쉽습니다. 이 문제를 일으킬 것으로 예상합니다. 경우 문제가 아니다

: 당신은 당신의 고객을 보장 할 수

  • 은/서버는 모든 코드의 정확히 같은 버전을 실행됩니다.
  • 이전 버전에서 작성한 데이터는 읽을 필요가 없습니다.

어쩌면 그게 당신 상황 일지 모르지만 개인적으로 나는 버전 화에있어 더 유연해질 수있는 직렬화 형식을 선호합니다. 이제는 바이너리 또는 텍스트 일 ​​필요는 없습니다. JSON, Protocol Buffers, Thrift 또는 기타 여러 옵션을 사용할 수 있습니다. 각각은 별도의 장단점이 있지만 각각의 버전은 Java보다 버전 호환성이 더 간단하도록 설계되었습니다.

이제 Java 직렬화의 위쪽은입니다. 모든 것이 작동하는 (전체 트리가 직렬화 가능) 상황에있는 동안 다른 변경없이 직렬화 할 수 있습니다. 데이터를 모델링 할 필요가 없습니다 별도로 직렬화 프레임 워크를 사용하는 것과 같습니다. 불행히도 이 아닌 클래스를 사용하여 나무에 어딘가에 직렬화 할 수있는 클래스를 사용하면 ...

텍스트와 이진 형식 중 하나를 선택하는 데있어 찬반 양론 합리적으로 입니다. 텍스트는 더 크지 만 네트워크 추적을보고 무슨 일이 벌어지고 있는지 진단하는 것이 더 쉽습니다. 물론 양쪽 모두 동일한 인코딩을 사용해야합니다.

혹시 비 Java 클라이언트/서버와 통신하려는 경우 아, 그리고 물론, 당신은 당신이 자바의 네이티브 직렬화 :

+1

+1 : 대부분의 바이너리 형식은 텍스트 형식보다 작지만 텍스트 직렬화는 자바 직렬화보다 작을 수 있습니다 (나중에 비효율적이기 때문에). –

2

It.sa 통증을 사용한 경우 힘든 시간을해야합니다 직렬화 된 객체와의 후위 비교 가능성을 유지하고 비 자바 클라이언트는 사용자의 서비스와 대화 할 수 없습니다. 직렬화 된 객체는 직렬화 된 크기와 관련해서도 훌륭하지 않습니다.

대신 프로토콜 버퍼와 같은 것을 사용할 것입니다.

관련 문제