2015-01-13 5 views
0

파이썬을 사용하여 RPC 호출을하는 방법을 이해하려고합니다.클래스 정의와 함께 파이썬 객체 직렬화

# server.py 
class Greeter(object): 
    def __init__(self, name): 
     self.name = name 
    def greet(self): 
     return "Hi {}!".format(self.name) 

def greeter_factory(name): 
    return Greeter(name) 

some_RPC_framework.register(greeter_factory) 

Greeter의 인스턴스하고 싶어 클라이언트 :

# client.py 
greeter_factory = some_RPC_framework.proxy(uri_given_by_server) 

h = greeter_factory("Heisemberg") 
print("Server returned:", h.greet()) 

문제는이 나는 클래스를 정의하고 해당 클래스의 인스턴스를 생성하는 방법을 노출하는 바보 서버가 사용자 정의 된 개체의 인스턴스를 반환 할 수있는 프레임 워크가 없거나 개체의 특성 (예 : Pyro4)을 가진 dict 만 반환한다는 것을 발견했습니다.

필자는 Java RMI를 사용하여 클라이언트가 컴파일 된 클래스를 다운로드 할 수있는 서버에서 코드베이스를 지정할 수 있습니다. 파이썬에 이와 같은 것이 있습니까? 클래스 바이트 코드와 함께 객체를 직렬화하여 클라이언트가 클래스의 전체 인스턴스를 가질 수있게하는 일부 프레임 워크일까요?

답변

0

파이로는 어느 정도 이것을 수행 할 수 있습니다. 기본 직렬 변환기를 사용할 때 사용자 정의 클래스 (de) 직렬 변환기를 등록 할 수 있습니다. 또는 피클 시리얼 화기를 사용하기로 결정할 수도 있지만 보안에 심각한 영향을 미칩니다. http://pythonhosted.org/Pyro4/clientcode.html#serialization

피클 시리얼 화기를 사용할 때조차도 Pyro가하지 않는 것은 모듈 정의를 구성하는 실제 바이트 코드를 전송하는 것입니다. 귀하의 경우 클라이언트는 클래스를 정의하는 모듈을 규칙적으로 가져올 수 있어야합니다. 코드 전송은 없습니다. 페이로드가 수신되면

0

당신은 할 서버 측과 클라이언트 측에서

payload = CPickle.dump(Greeter(name)) 

사용을 고려할 수 있습니다 -

h = CPickle.load(payload) 

는 손님 맞이 도우미의 인스턴스가 해당 서버가 생성 한 객체를 얻을 수 있습니다.