2016-11-02 694 views
-2

바이트 배열에서 java.io.Serializable의 인스턴스를 가져와야하는 도구를 작성 중입니다.
어려움은 classpath에 "진짜"클래스가 없다는 것입니다. (왜 여기에 .. 설명하지 않겠습니다). 구현 클래스
Q 클래스 경로 상에 있지 않기 때문에
코드는 아래에 ClassNotFoundExceptionis.readObject()에 실패 인가
이것을 달성하는 것이 가능하다? 반사에 의해? Unsafe을 사용하여? ClassLoader의 하위 클래스를 사용하여? 또는...?classpath에서 구현 클래스없이 "직렬화"의 인스턴스를 deserialize하는 방법은 무엇입니까?

byte[] data = ... 
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));) { 
    Object o = ois.readObject(); 
    Serializable s = (Serializable)o; 
} 
+1

* 이것을 구현할 수 있습니까? * 구현하지 않아도됩니다. 예,'classLoader'를 써서 클래스를로드 할 수 있습니다. 하지만 수업을 다시해야합니다. –

+0

엘리엇이 말한 것과 마찬가지입니다. Java 직렬화는 클래스 자체가 아니라 클래스의 데이터 만 전송합니다 (데이터가 의미하는 방법이나 정의가 아님). 수업이 없으면, 당신은 가라 앉았습니다. – markspace

+0

나는 downvotes가 왜 이런 종류의 질문을하는 것이 "나쁘다"는 것을 알고 싶다. 또는 사용자에게 오류가 발생 했습니까? 거짓 앵커를 주겠습니까? 나는 그렇게 생각하지 않는다. – titou10

답변

1

이를 달성 할 수 IIS를 있습니까?

번호

반사에 의해

?

불안전 이용하여 제

?

서브 클래스 로더의 클래스를 사용하여 제

?

예.하지만 클래스 로더는 여전히 클래스를 어딘가에서 가져와야합니다. RMI 코드베이스 기능은 좋은 예입니다.

+0

JEE와 JMS API로 작업하고있다. JMS에는 "직렬화 가능"객체를 캡슐화 할 수있는 "ObjectMessage"클래스 (http://docs.oracle.com/javaee/7/api/javax/jms/ObjectMessage.html)가 있습니다. 이 메소드는 getObject() 메소드를 사용하여 직렬화 할 수있다. 구현 클래스가 클래스 경로에 없더라도이 메서드는 작동합니다. 그래서 나는 그들이 그것을 어떻게 조사하기 위해이 API의 구현을 디 컴파일해야 할 것 같아요 – titou10