2013-09-05 29 views
6

シリアライズ可能なクラスを実装しています。クラスには、直列化可能ではない他のクラスオブジェクトがあります。クラスのメンバーをシリアライズするためには何をすべきか。シリアライズ可能でないクラス変数をシリアライズ

私のクラスには、私はそれがSerializableを実装するためにAddressクラスへのアクセス権を持っていけない、ここでは、この

public class Employee implements Serializable{ 
    private String name; 
    private Address address; 
} 


public class Address{ 
    private String street; 
    private String area; 
    private String city; 
} 

のようなものです。助けてください。事前に感謝

+0

Javaのシリアライゼーションを使用する必要がありますか? –

答えて

3

もちろん、Serializableを置く明らかな解決策があります。私はそれが常にオプションではないことを理解しています。

おそらくAddressを拡張して、あなたが作る子供にSerializableを置くことができます。次にEmployeeにはAddressフィールドの代わりにChildフィールドがあります。ここで

は、考慮すべきいくつかの他のものです:

  • あなたAddress型としてEmployee.addressフィールドを維持することができます。 Employee.setAddress(new SerializableAddress())
  • Addressがnullの場合、Addressの型がシリアライズ可能でなくても、従業員全体をシリアル化できます。
  • Addressを一時的にマークすると、Addressのシリアル化をスキップします。これはあなたの問題を解決するかもしれません。

さらに、XStreamのようなマーカーインターフェイスを必要としない他の「シリアル化」フレームワークがあります。それはあなたの要件に依存しますかどうかは、オプションです。

+0

私はそれを拡張しません**。とにかくメンバーはプライベートです。クラス 'SerializeableAdress'を作成します。このクラスは、' Adress'の正確なコピーでなければなりません。 – mike

+0

@mike彼らはプライベートですが、すでに 'Serializable'です。それは非問題ではないでしょうか? –

+0

アドレスクラスを拡張する以外の方法はありますか? – user2047302

1

このAddressクラスを変更するアクセス権がないため、このクラスを直接シリアライズすることはできません。

いくつかのオプションがあります:

  • Addressクラスのサブクラスを作成し、それを使用するには。このクラスをシリアライズ可能としてマークすることができます。
  • アドレスをトランジェントとしてマークします。

あなたはシリアル化のためのサードパーティのライブラリを使用するためのオプションを持っている場合、あなたは、たとえばkryoのために使用することができ、このstackoverflowリンク

+0

また、このクラスは他の多くのロジックでも使用されています。まったく同じ新しいクラスを作成する必要がある場合は、アプリの多くの部分を書き直す必要があります。 – user2047302

+0

このクラスを継承するには、その中のどのメソッドもオーバーライドしないでください。基本クラスと同じくらい良いでしょう。 –

関連する問題