2011-10-23 6 views
1

は、私はインターフェイスやオブジェクトを持っていると言う:シリアル化の前にオブジェクトがアップキャストされている場合、Javaではシリアル化はどのように機能しますか?

public interface MyInterface { 
    public String getStringOne(); 
} 

public class MyObject implements MyInterface { 
    private final String stringOne = "string1"; 
    private final Image myGiganticImage; // loads from disk in the constructor 

    // Getters for both would follow 
} 

私はワイヤーを渡ってそれを送信する前にMyInterfaceにMyObjectにをアップキャスト場合は転送されますか?

public class MyService { 
    private final MyObject data = new MyObject(); 

    public MyInterface getData() { 
     return data; 
    } 
} 

具体的には、myGiganticImageが電信を介して送信されますか?

+0

あなたは 'ObjectOutputStream.writeObject(オブジェクト)を見れば'あなたはすべての参照がアップシリアライズする前にオブジェクトにキャストされていることがわかります。 –

答えて

5

明らかに、MyObjectの状態がシリアル化されています。 public MyInterface getData()は、getData()によって返されるタイプが-MyInterfaceであることを強制します。

+0

ワイヤを通るデータ量を減らしたい場合は、新しいオブジェクトを作成する必要があります。私は私の質問を更新しました。私が更新した例では、 'myGiganticImage' **が**電線の向こう側に送られるでしょうか? –

+0

「一時的ではなく、静的でない」フィールドはすべてシリアル化されます(カスタムの 'writeObject(ObjectOutputStream)'がない限り)(http://download.oracle.com/javase/7/docs/api/java /io/Serializable.html)メソッドは、世話をする) - 直列化は、 'Serializable'を実装している限り、直列化されるオブジェクトの型/クラス/インタフェースを気にしません –

1

アップキャスティングは、オブジェクトの内容を変更しません。

0

アップキャストは、ポインタタイプを変更する方法です。同じデータ構造がポインタ型に関係なくJVMヒープ上に保持されます。この構造は実際にあなたがそれを指し示す方法を気にしません。

オブジェクトシステムをシリアライズするとき(おそらく)、オブジェクトに対してクラス(getClass())を要求し、リフレクションを使用してこのクラスからすべてのフィールドを読み込みます。 オブジェクトは、オブジェクトを使用してそのクラスを指しても、常にそのクラスを報告します。

システムは常に、フィールドリストを取得するためにjavaの唯一の方法であるため、クラスのフィールドを読み込みます。

あなたがオブジェクトの親を転送したい場合は、私の解決策を試してください:Deserialize remote object to the narrowest accessible class

関連する問題