2009-08-08 5 views
1

Java의 ObjectInputStream에서 읽을 최대 버퍼 크기를 제한하는 방법이 있습니까?ObjectInputStream을 통해 소켓에서 읽는 최대 크기를 제한하는 방법은 무엇입니까?

문제의 오브젝트가 악의적으로 거대하게 만들어 졌음이 분명 해지면 비 직렬화를 중지하고 싶습니다.

물론 ObjectInputStream.read (byte [] buf, int off, int len)가 있습니다.하지만 할당의 성능상의 어려움을 겪고 싶지는 않습니다. 바이트 [1000000]라고 말하면됩니다.

여기에 뭔가가 있습니까?

답변

4

FilterInputStream을 작성하면 기본 스트림에서 일정량 이상의 데이터를 읽었을 때 예외가 발생합니다.

+0

Tanky you very much! 아주 좋은 포장지! – SAL9000

2

두 가지 방법이 있습니다.
1) 루프에서 읽기 작업을하고, 할당 크기가 적당한 청크를 잡아 내고, 한도에 도달하면 종료하고 종료하십시오. 또는 2) max-size 버퍼를 한 번 할당하고 후속 읽기에 다시 사용하십시오.

+0

정말 고마워요! 나는 1 호를 사용하여 Jon Skeets FilterInputStream 제안에 포장하려고 시도 할 것이다. – SAL9000

+0

당신을 진심으로 환영합니다. ** Jon Skeet **의 대답은 우월합니다. 그것들은 "어떻게되는지"관점과 동일하지만,'FilterInputStream'은 훨씬 더 명확하고보다 표준 적입니다. 휠 - 재창조가 줄어 듭니다. – CPerkins

1

사실, 정말 쉬운 방법이 있습니다.

NIO의 ByteBuffer를 사용할 수 있으며 allocateDirect 메서드를 사용할 수 있습니다. 이 방법을 사용하면 메모리 매핑 파일을 할당 할 수 있으므로 엄청난 오버 헤드가 없으며 크기를 제한 할 수 있습니다.

그런 다음 소켓에서 스트림을 가져 오는 대신 채널을 가져옵니다.

코드 : 이제

Socket s; 

    ByteBuffer buffer = ByteBuffer.allocateDirect(10 * 1024 * 1024); 
    s.getChannel().read(buffer); 

는, 바이트 버퍼에 방법 "() 배열을"전화를하려고하지 않는다 직접 할당 된 버퍼에서는 작동하지 않습니다. 다만, wrap the buffer as an input stream을 사용해, 추가 처리를 위해서 ObjectInputStream에 송신 할 수 있습니다.

관련 문제