2014-11-28 2 views
0

Netty 3.9를 사용 중입니다. 나는 http://en.wikipedia.org/wiki/Netty_%28software%29#Netty_TCP_Example에서 얻은 간단한 클라이언트 서버 설정을 가지고있다. Java 검색 계획 객체를 클라이언트에서 서버로 보내기위한 예제를 확장했습니다.Netty 인코딩/디코딩 Java 오브젝트

검색 계획 객체는 직렬화 및 비 직렬화 메소드가있는 타사 객체입니다. 직렬화는 객체를 byte [] 배열에 씁니다. 내 클라이언트 파이프 라인 팩터리는 다음과 같습니다.

this.bootstrap.setPipelineFactory(new ChannelPipelineFactory() { 
     @Override 
     public ChannelPipeline getPipeline() throws Exception { 
      return Channels.pipeline(
        new StringDecoder(CharsetUtil.UTF_8), 
        new StringEncoder(CharsetUtil.UTF_8), 
        new DelimiterBasedFrameDecoder(
          ALLOWED_CHARACTER_BUFFER_SIZE, Delimiters 
            .lineDelimiter()), 

        /* We also add our Clients own ChannelHandler. */ 
        new ClientChannelHandler()); 
     } 
    }); 

StringDecoder 및 StringEncoder가 올바르지 않다고 생각합니다. 내가 볼 수없는 일종의 ByteEncoder/Decoder가 필요하다고 생각합니다. 이것들을 써야합니까? 나는 아무리 내가 실패 객체를 "직렬화"할 일을 클라이언트

byte[] byteVersion = searchPlanRepo.serialize(missionNum); // serialize the search plan 
searchPlanStr = new String(byteVersion, StandardCharsets.UTF_8); 

에 있지만 서버에 문자열로 변환하지 않습니다이 코드를 시도했다.

"java.lang.ClassCastException가 : java.lang.String의이 payload.mission.SearchPlanType 캐스트 할 수없는"

내 질문 :

  1. 내가이 필요하십니까 나는 계속해서 오류 메시지가 사용자 정의 바이트 인코더/디코더? 어떤 예가 있습니까?
  2. 직렬화가 단순 해 보인다 : 바이트 배열에서 문자열이지만 문자열에서 바이트 배열로의 직렬화가 작동하지 않습니다. 나는 뭔가를 놓치고 있다고 확신한다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

시간을내어 읽어 주셔서 감사합니다. :)

당신은 직렬화 코덱을보고있을 수 있습니다

답변

0

샘플 ObjectDecoder 및 ObjectEncoder 예제를 살펴본 결과이 문제가 해결되었습니다. 클라이언트에서 파이프 라인 코드를 변경 했으므로 이제 내 임무를 보낼 수 있습니다. 다음은 클라이언트/발신자의 코드입니다.

this.bootstrap.setPipelineFactory(new ChannelPipelineFactory() { 

     @Override 
     public ChannelPipeline getPipeline() throws Exception { 
      return Channels.pipeline(
        new ObjectEncoder(), 
        new ObjectDecoder(ClassResolvers 
          .cacheDisabled(getClass().getClassLoader())), 
        new ClientChannelHandler()); 
     } 
    }); 

서버/수신기의 pipelineFactory 코드는 거의 동일합니다. 유일한 차이점은 각면에 대한 처리기입니다. 클라이언트는 단순히 서버로부터 메시지를 기록하는 ClientChannelHandler를 사용합니다. 서버는 ServerChannelHandler를 사용합니다. ServerChannelHandler는 수신 된 임무를 가져 와서 올바른 Java 유형으로 변환하여 조작 할 수 있습니다.