現在、クライアント/サーバー アプリケーションを開発しています。アプリケーション サーバーは Glassfish v3 で、通信はリモート EJB によって行われます。主な問題は、オブジェクト グラフをシリアル化するときにネットワーク帯域幅が大量に使用されることです。たとえば、次の方法では:
@Stateless
public class MyEJB extends MyRemoteInterface {
@Override
public PurchaseOrder savePurchaseOrder( PurchaseOrder po ) { ... }
}
このメソッドは、リモートで呼び出されると、PurchesOrder インスタンスを受け取ります。これはオブジェクト グラフであり、ネットワークを介して転送されると、返されるときと同じように大量の KB が必要になります。
今のところ、メソッドのプロトタイプを次のように変更して、これを管理しています。
...
@Override
public byte[] savePurchaseOrder( byte[] po ) { ... }
...
ネットワーク経由で転送する前後に、PurchaseOrder インスタンスを手動で解凍/圧縮およびシリアル化解除します。しかし、私は型安全なメソッドを失い、見苦しくなります。
デフォルトのシリアル化プロセスで出力ストリームを圧縮するためにJavaカスタムシリアル化を使用する方法はありますか? 例えば:
@Entity
public class PurchaseOrder implements Serializable {
private void writeObject(ObjectOutputStream oos) throws IOException {
// default serialization
oos.defaultWriteObject();
// COMPRESS STREAM HERE (zip or gzip)
}
private void readObject(ObjectInputStream ois)
throws ClassNotFoundException, IOException {
// DECOMPRES STREAM HERE
// default deserialization
ois.defaultReadObject();
}
}
「DE/COMPRESS STREAM HERE」部分のコード、または別の良いアイデアが必要です。
アドバイスをいただきありがとうございます。
ザビエル。