2011-02-02 1 views
3

Java의 RMI를 통해 원격 메소드를 호출하는 단순성과 매우 흡사합니다. 그러나 직렬화 형식의 자세한 정보는 중요한 버즈 킬입니다 (예, 벤치마킹 해 주셔서 감사합니다). 썬의 아키텍트는 RPC (느슨하게 말하자면) 컴포넌트를 디자인 할 때 명백한 일을 한 것처럼 보였지만 직렬화를 구현할 때 서사시는 실패했습니다.타사 라이브러리를 사용하여 (쉽게) Java RMI의 직렬화를 처리 할 수 ​​있습니까?

반대로, 그것은 드리프트, 아 브로, Kryo (특히), 프로토콜 버퍼 (순전히), 등의 건축가를 보인다 자신의 직렬화 형식을 설계하지만, 하나는 제공하지 않는 경우은 일반적으로 분명 옳은 일을했다 RPC 메커니즘을 사용하면 불필요하게 복잡한 (또는 미성숙 한) 메커니즘이나 원격 메소드를 호출하는 것보다 데이터 전송을위한 도구를 제공 할 수 있습니다 (많은 용도로 완벽하게 사용할 수 있지만 내가 원하는 것은 아닙니다).

명백한 질문 : 어떻게 RMI의 메서드 호출 사랑 스러움을 사용할 수 있습니까? 그러나 위의 라이브러리 중 하나를 유선 프로토콜로 사용합니까? 이것은 많은 일없이 가능합니까? 나는 위의 라이브러리들 중 하나를 너무 가혹하게 평가하고있다. (NB 나는 일반적으로 코드 생성을 매우 싫어한다. 나는 불필요한 주석을 약간 싫어한다. XML 설정이 꽤 많이있다. 어떤 종류의 "beans" 이상적으로, 나는 RMI처럼 원격 객체를위한 인터페이스를 구현하려고한다.

+0

당신이 언급 한 많은 libs (Kryo는 아님)의 주된 문제점은 Schemas의 정의가 필요하다는 것입니다. 스키마를 정의하면 일반 사용 (POJO RPC 사용)이 어렵거나 불가능합니다. – StaxMan

+0

고속 직렬화는 JDK 직렬화 호환 재 구현입니다. ObjectXXXputStream 클래스를 대체하는 데 필요한 후크가 있는지 확실하지 않습니다. https://github.com/RuedigerMoeller/fast-serialization –

답변

2

옛날 옛적에 나는 같은 요구 조건을 가지고있었습니다. rmi 메소드의 인수를 변경해, 형태를 byte []에 돌려주었습니다.

내가 선호하는 직렬 변환기를 바이트 배열로 직렬화 한 다음 수정 된 rmi 메서드라고했습니다.

글쎄, 자바 직렬화가 너무 길다는 것을 언급했듯이, 5 년 전 나는 공간 효율적인 직렬화 알고리즘을 구현했다. 그것은 매우 복잡한 객체 그래프를 보내는 경우 너무 많은 공간을 절약합니다. 최근 Dev 모드에서 GWT 직렬화가 매우 느리기 때문에이 직렬화 구현을 GWT로 이식해야합니다.

예로서;

RMI 방법

public void saveEmployee(Employee emp){ 
    //business code 
} 

아래처럼 변경해야합니다,

public void saveEmployee(byte[] empByte) { 
     YourPreferredSerializer serialier = YourPreferredSerializerFactory.creteSerializer(); 
     Employee emp = (Employee) serializer.deSerialize(empByte); 
     //business code 
    } 

는 편집 :

당신은 MessagePack을 확인해야합니다. 그것은 유망 해 보인다.

+0

재미 있습니다. 좀 더 자세히 설명해 주시겠습니까? – user359996

+0

아마도 성능에 대한 합리적인 (여기에 바이트 [] 대 Externalizable 비교하는 재미있는 수도 있습니다)하지만 원격 인터페이스는 아무것도 * 될 수있는 바이트 []의 톤이됩니다. 이것은 확실히 세계에서 가장 친숙한 인터페이스가 아닙니다. – Matt

+0

글쎄, 네 말이 맞아. 이것은 단점입니다. :) .. 너무 많은 도메인 클래스가 직렬화되어야한다면, externalizable 인터페이스는 옵션이 아닙니다. –

1

나는 RMI를 재 연결하는 방법이 없다고 생각하지만 구체적인 교체 프로젝트가 될 수도 있습니다 - 구체적으로 생각하면 DiRMI일까요? 그리고/또는 프로젝트 소유자는이 작업에 도움을 줄 수 있습니다 (Brian, 작성자는 Amazon.com의 유능한 기술자입니다).

또 다른 흥미로운 프로젝트는 Protostuff입니다. 저자도 RPC 프레임 워크를 작성하고 있습니다. 그러나 그것 없이도 데이터 형식의 인상적인 범위를 지원합니다; 매우 효율적으로 처리합니다 (https://github.com/eishay/jvm-serializers/wiki/).

Btw, 저는 개인적으로 PB와 Avro와 같은 대부분의 프로젝트가 RPC와 직렬화 측면을 적절히 구분하지 못하게하는 가장 큰 실수가 있다고 생각합니다. 플러그 형 데이터 형식이나 serialization 공급자를 사용하여 RPC를 수행 할 수있는 능력이 좋은 생각입니다.

+1

+1 "개인적으로 PB와 Avro와 같은 대부분의 프로젝트가 RPC와 직렬화 측면을 적절하게 구분하지 못하는 가장 큰 실수라고 생각합니다."- 마음! – user359996

+0

Hehe. 죄송합니다! :) – StaxMan

+0

Externalizable 인터페이스를 구현하여 다소 RMI를 재사용 할 수 있습니다. 다소 방해가 되긴하지만 말입니다. 아마도 rmi-iiop도 이점을 제공 할 수 있습니다. – nos

1

writeReplace() 및 readResolve()는 아마도 이렇게하는 데 가장 적합한 조합 일 것입니다. 오른쪽 손에 강력한 힘.

1

Java 직렬화는 직렬화하는 클래스와 필드를 설명하는 경우에만 자세하게 설명합니다. 전반적으로 형식은 XML로 "자체 설명하는"것입니다. 실제로 이것을 대체하고 다른 것으로 대체 할 수 있습니다. 이것이 writeClassDescriptor 및 readClassDescriptor 메소드의 용도입니다. Dirmi는 이러한 메서드를 재정의하므로 적은 오버 헤드로 표준 개체 직렬화를 사용할 수 있습니다.

작동 방식은 세션 작동 방식과 관련이 있습니다. 두 종단점은 서로 다른 버전의 객체를 가질 수 있으므로 클래스 설명자를 버리면 작동하지 않습니다. 대신 직렬화 된 설명자가 세션 고유 식별자로 대체되도록 추가 데이터가 백그라운드에서 교환됩니다. 식별자를 보았을 때, 룩업 테이블은 디스크립터 객체를 찾기 위해 조사된다. 데이터가 백그라운드에서 교환되기 때문에 세션이 작성된 후 및 오브젝트 유형이 처음으로 기록 될 때마다 간단한 "워밍업 기간"이 있습니다.

Dirmi는 현재이 회선 형식을 대체 할 방법이 없습니다.

관련 문제