2016-10-07 5 views
1

オブジェクトが別ファイルで定義され、動作する以下の単純なソケットアプリケーションを記述しました。Pythonはソケットにインポートされていないオブジェクトをシリアル化しません

# models_object.py 
class Person(object): 
    def __init__(self,name,surname,age):  
     self.name = name 
     self.surname = surname 
     self.age = age 

    def __str__(self): 
     return self.name + " " + self.surname 

#client.py 
import cPickle,socket 
from model_objects import Person 

def client():  
    client = socket.socket()   
    host = socket.gethostname()   
    port = 8000     
    adem_kerenci = Person("Adem","Kerenci",22)  
    serialized_object = cPickle.dumps(adem_kerenci) 
    client.connect((host, port))     
    client.send(serialized_object)     
    client.close()         

client() 

#service.py 
import cPickle,socket 

def server():   
    server = socket.socket()      
    host = socket.gethostname()     
    port = 8000     
    server.bind((host, port))       
    server.listen(1)       
    connection, address = server.accept()   
    recieved_data = connection.recv(2**20) 
    print cPickle.loads(recieved_data)    
    connection.close()       

server()   

私はclient.pyPersonクラス定義を記述する場合は、コードは以下のエラーが発生します。

Traceback (most recent call last): 
    File "service.py", line 14, in <module> 
    server()   
    File "service.py", line 11, in server 
    print cPickle.loads(recieved_data)   
AttributeError: 'module' object has no attribute 'Person' 

インポートとシリアライズの間に関連はありますか?

注:私たちはdocumentationからのpython 2.7

答えて

1

を試してみました:関数(組み込みおよびユーザ定義)がない値で、「完全修飾」名を参照することにより漬けされている

注意を。これは、関数が定義されているモジュールの名前と共に、関数名だけがpickle化されることを意味します。関数のコードも、その関数属性のいずれもpickleされません。したがって、定義モジュールはunpickle環境でインポート可能でなければならず、モジュールには名前付きオブジェクトが含まれていなければなりません。それ以外の場合は例外が発生します。 model_objects.Person

これは、サーバーにunpickle化されたオブジェクトは、最初の例である同じ"fully qualified" nameとサーバーコードから、あまりにもインポート可能でなければならないことを意味します。これは、client.pymodel_objects.pyを1つのフォルダに分割し、service.pyを別のフォルダに分割しようとすると、最初のケースでは明らかです。のファイルをインポートしようとしているのと同じエラーが表示されますが、見つけられませんでした。

2番目のケースでは、Personクラスもサーバーコードにコピーできますが、これはうまくいきますが、これは悪い習慣です。また、クライアントとサーバーの共有フォルダを作成することもできます。 )。

これは、unpickling中にpythonはオブジェクトのクラスを必要とし、オブジェクトを再インスタンス化して使用する必要があるからです。

関連する問題