복붙노트

[SPRING] 가장 좁은 액세스 가능 클래스에 원격 객체를 직렬화 복원합니다.

SPRING

가장 좁은 액세스 가능 클래스에 원격 객체를 직렬화 복원합니다.

shared.jar에서 나는 :

abstract class MyParent {

}
abstract class MyClass {
   MyParent getFoo();
}

server.jar는 다음을 포함합니다.

abstract class MyChild extends MyParent {

}
abstract class MyClassConcrete {
   MyParent getFoo() {return new MyChild();}
}

client.jar :

MyParent foo = myClass.getFoo();

3 개의 병이 모두 하나의 클래스 로더에 있으면 모든 것이 잘 작동합니다.

하지만 클라이언트와 서버는 다른 JVM에 있습니다.

클라이언트가 서버를 호출합니다. 서버가 MyConcreteClass를 반환하고 Java가이를 역 직렬화하지 못합니다 (ClassNotFoundException).

내가 뭘하고 싶은지 :

그리고 모든 것은 괜찮습니다. 우리는 클라이언트 상에 MyParent의 인스턴스를 가지고 있으며, 이것이 우리가 필요로하는 것입니다.

나는 그런 엔진이 없다고 믿을 수 없다. 당신은 그걸 압니까? 가능한 한 원격 통화가 지역 통화와 비슷해야합니다.

감사.

해결법

  1. ==============================

    1.실제로 솔루션을 발견하고이를 지원하는 특별한 패키지를 만들었습니다.

    실제로 솔루션을 발견하고이를 지원하는 특별한 패키지를 만들었습니다.

  2. ==============================

    2.java.io.Serializable 인터페이스를 구현하는 객체는 writeReplace () 및 readResolve () 메서드를 사용하여 직렬화 / 역 직렬화되는 객체를 다른 객체로 대체 할 수 있습니다. 나는 이것이 귀하의 문제를 해결하는 데 사용되는 것을 볼 수 있습니다. 그러나, 나 자신을 시도하지 않았습니다.

    java.io.Serializable 인터페이스를 구현하는 객체는 writeReplace () 및 readResolve () 메서드를 사용하여 직렬화 / 역 직렬화되는 객체를 다른 객체로 대체 할 수 있습니다. 나는 이것이 귀하의 문제를 해결하는 데 사용되는 것을 볼 수 있습니다. 그러나, 나 자신을 시도하지 않았습니다.

  3. from https://stackoverflow.com/questions/10249569/deserialize-remote-object-to-the-narrowest-accessible-class by cc-by-sa and MIT license