2011-12-22 9 views
0

java.io.NotSerializableExceptionを取得しています。外部APIからのオブジェクトのシリアル化

java.io.Serializableを実装していないオブジェクトをシリアル化するにはどうすればよいですか?

ストリームでシリアル化したいと思います。

外部APIからオブジェクトをシリアル化する必要があります。このAPIを変更することはできません。

は外部APIで、このオブジェクトは、プライベートフィールドがある java.io.Serializable

確かに実装されていませんが、getterおよびsetterメソッドがたくさんあります。 public staticフィールドがあり、引数なしのコンストラクタはありません。実際にコンストラクタはありません。

シリアル化するのは難しいと思いますか? 提案がありますか?

答えて

1

外部APIをオーバーライドできる場合は、外部クラスの子である独自のクラスを作成できます。

あなたの子クラスはSerializableインターフェイスを実装でき、クラスをシリアル化できます。

EX-

についてはウル外部クラスは、私はあなたの質問から理解して何から

class ExternalAPIClass 
{ 
.. 
.. 
} 

Class MyClass extends ExternalAPIClass implements Serializable 
{ 

.... 
... 
... 
} 
+0

問題は、このExternalAPIClassもシリアル化できないオブジェクトを使用することです。 – Jvrq

+0

問題は、このExternalAPIClassはシリアル化できないオブジェクトも使用することです。このAnotherEXternalAPIClassもオーバーライドする必要がありますか? – Jvrq

+0

その場合、スーパークラスの非シリアライズ可能な部分は、あなたの子クラス(MyClass)からアクセス可能で、それらの部分のカスタムシリアル化のための独自のメソッドを書くことができます。また、その場合、スーパークラス(ExternalAPIClass)にはデフォルトの引数なしコンストラクタが必要です。 writeObject()とreadObject()を実装し、これらの非直列化可能フィールドの手動による直列化/逆シリアル化を行います。 –

0

である、あなたは、そのオブジェクトの新しいインスタンスを作成し、セッターを介して自分のフィールドを設定することができます。次に、ゲッターを使ってオブジェクトのすべてのフィールドをマップに抽出し、そのマップをシリアル化することをお勧めします。

後でマップをデシリアライズし、オブジェクトの新しいインスタンスを作成し、すべてのフィールドをセッターに戻します。

もちろん、これは、IDのように、構築時に設定された読み取り専用フィールドがないことを前提としています。その場合、IDは異なるためです。

関連する問題