2010-12-05 12 views
1

私はJava RMIを使ってプロジェクトを進めています。 これが問題の原因となったクラスです。RMIでのJavaシリアル化

public class FSFile implements Serializable 
{ 
public static final int READ = 0; 
public static final int WRITE = 1; 

private int  flag; 
private String filename; 

private transient BufferedWriter writer; 
private transient BufferedReader reader; 

... 

private void writeObject(ObjectOutputStream stream) throws IOException 
{ 
    stream.defaultWriteObject(); 
    stream.writeObject(writer); 
    stream.writeObject(reader);  
} 

private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException 
{ 
    stream.defaultReadObject(); 
    writer  = (BufferedWriter) stream.readObject(); 
    reader  = (BufferedReader) stream.readObject(); 
} 
} 

基本的に、私は(今のところ)ローカルで他のプロセスにそのFSFileオブジェクトを送信するためにRMIを使用して、ここで私が手にエラーがあります:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:                  
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException; 
java.io.BufferedReader 

以上であるために正確には、FileServiceという名前のクラスがあり、FileServerから関数fetch()を使用してFSFileを取得します。 fetch()関数に特別なものは何もなく、FSFileを作成して返します。これらのクラス間のすべての通信は、RMIを介して行われます。

どうして私のようなエラーがありますか?

答えて

3

リーダとライターをシリアル化することはできません。意味がない。それは電話回線で電話を送ろうとするようなものです。ファイルを送信する場合は、ファイルを送信します。

あなたのコードは、これらのオブジェクトのwriteObjectをSerializableであるかのように呼び出します。彼らはそうではありません。それ以外の場合は、非一時的なものにして、カスタムreadObjectメソッドとwriteObjectメソッドを省略することもできます。とにかくシステムがやったことを再コーディングするだけで何も変わらない。確かに、そうでないクラスはシリアライズ可能ではありません。

+0

私のカスタムクラスではなくファイルを送信するように提案していますか? 私がしたかったのは一方の端からです。ちょうどそのFSFileが読み書きを呼び出すだけで、他方の端でローカルに実行されます。私がwriteObjectとreadObjectを使いたいのは、その状態を維持することだけです。 – David

+0

実際、リモートユーザーはクラスFileを使用して読み書きすることはできません。 – David

+0

いいえ私はファイルを送ることを提案していません。それはちょうど名前です。私はコンテンツを送ることを話している。別の話であるI/O機能を備えた何らかのリモートファイルを実装したい場合は、独自のRemoteOutputStreamなどを実装する必要があります。不可能ではなく、システムIMOを設計する素晴らしい方法ではありません。 – EJP

3

RMI経由でファイル/ストリーム送信を再実装したくない場合は、RMIIOを調べると、そのようなことが簡潔かつ効果的に処理されます。

関連する問題