2017-05-26 5 views
0

同僚と私は特定のシナリオについて意見の不一致があります。Serializableオブジェクト内の静的メソッド呼び出し

Serializableオブジェクトは、toString()メソッドを持ちます。このtoString()は、ApacheのReflectionToStringBuilderを呼び出すことによって実装されます。このようなもの:

public class Foo implements Serializable { 
    // bunch of instance variables, getters and setters ... 

    @Override 
    public String toString() { 
     return ReflectionToStringBuilder.toString(this); 
    } 
} 

これらのオブジェクトがどのように渡されるかは制御できません。私たちの特定のアプリケーションでは、RMI呼び出し、HTTP POST(JSon文字列として書いた後)、JMS経由、または他のプロトコル経由でそれらを渡すかもしれません。

JSonの文字列の大文字小文字は問題ではありません。文字列形式で送信されるため、toString()メソッドの実装の詳細は問題になりません。しかし、他のプロトコル(いくつかの)では、オブジェクト自体を直列化することが期待されます。

Serializableクラスのメソッドは静的メソッドを呼び出すことはできますが、まだ(機能的に)直列化可能ですか?それはうまくコンパイルされますが、それでも電線の向こう側に送ることができますか?受信サービスがそのクラスパス上に静的メソッドのクラスを持っていない場合、非直列化に失敗しますか?

+3

どうやってテストしますか?ワイヤを介してオブジェクトを送信するときにシリアル化されるもの、クラスのバイトコード(レシーバがすでにクラスパスにある)、またはオブジェクトの状態(レシーバが知らない) –

+1

受信サービスはどのようにクラスを持ちますが、静的メソッドのクラスはできませんか? (実際に尋ねる)。私は、サービス間でシリアライズ可能クラスをどのように共有するか(それらがすべてライブラリを取得するかどうか、または各サービスでクラスを複製したかどうかにかかわらず)、コードのクラスパスに外部ライブラリを置く必要はないと考えましたさらにコンパイルするには? – Ishnark

+0

これに関する非常に良い説明が見つかりました[Java静的なシリアル化のルール?](https:// stackoverflow。com/questions/6429462/java-static-serialization-rules) –

答えて

1

はい、これは機能します。 toString()は、Javaの組み込みシリアライゼーションフレームワークによって呼び出されることは決してありません。したがって、基本的には何でもできます。

ほとんどの場合、シリアル化されたオブジェクトはフィールド単位でコピーされ、オブジェクトのメソッドは呼び出されません。クラスは特別なメソッド(詳細はhttp://www.oracle.com/technetwork/articles/java/javaserial-1536170.htmlを参照)を実装することでこのデフォルトの動作を変更できますが、これはあなたの例には当てはまりません。したがって、あなたのメソッドが何をしていても(toString()だけでなく)、シリアライゼーションには関係ありません。

次に、ReflectionToStringBuilderがクラスパスに含まれていないとどうなりますか?それは簡単です:何も起こりません。 ReflectionToStringBuilderが使用されていない限り(つまり、静的メソッドのいずれかが呼び出されるか、インスタンスを作成している)、そのクラスはロードされません(少なくともリンクされていない)ので、存在するかどうかは関係ありませんか否か。実際にそのクラスを使用しようとするときにのみNoClassDefFoundErrorが得られます。あなたのオブジェクトをデシリアライズすると動作しますが、toString()を呼び出すと例外が発生します。

1

あなたの例は、シリアル化にはまったく問題ありません。

理論では、JavaオブジェクトのJSON表現は単なる別の形式のシリアル化です。すべてのシリアライゼーションはオブジェクト "状態"をストリームに書き込み、ストリームからその状態を読み取ることができます。オブジェクトが持つ操作やtoStringメソッドなどの実装方法は気にしません。 この場合のJavaオブジェクトの状態は、インスタンス変数で表され、オブジェクトClass定義は含まれません。 Fooを読んだら、クラスパスにApacheのReflectionToStringBuilder.classと一緒にFoo.classがあるはずです。

関連する問題