2016-11-08 11 views
5

のは Javaは、シリアライズ可能なインターフェイスで使用すると、自動的にシリアライズ可能なクラスを作成しますか?

public interface SomeInterface extends Serializable { 

    public SomeClass getSomething(String someParameter); 

} 

SomeClass自動的にシリアライズだろう、次のように私はSerializableインタフェースを持っているとしましょうか? 驚いたことに、 SomeClassがSerializableを実装していない場合でも、私たちのRMIアプリケーションはうまく動作します。

これはなぜですか?

+0

シリアライズ可能(またはサブクラス)とマークされたクラスのみがシリアライズ可能です。おそらく 'SomeClass'はSerializableまたはExternalizableの何かを拡張または実装します。 –

+0

返されるのは、直列化可能な 'SomeClass'の派生クラスまたはnullです。 – EJP

+0

インターフェイスが実装され、クラスが拡張されます。 Serializableは、リフレクションを使用して任意のサブクラスを直列化するクラスです。 これは通常、複雑なサブクラスでは非常に非効率的であることに注意してください。より効率的なマーシャリングのためにprotobufまたはexternalizableを使用してください。 –

答えて

2

will SomeClassSerializableが自動的に表示されますか?驚いたことに、SomeClassSerializableが実装されていない場合でも、RMIアプリケーションは正常に動作します。

シリアル化オブジェクトの(非過渡的)状態をシリアル化についてです。あるメソッドの署名にgetSomethingが存在すると、には、インスタンスが含まれるように、のインスタンスの状態がである必要がありません。

方法は、新しく作成されたSomeClassを返すように実装transientフィールドの値は、他のいくつかのクラスにstaticメソッドを呼び出した結果、またはすることができ.... null

-1

いいえ、SomeClassSerializableになりません。このインターフェイスがSerializableに拡張されているからです。

Serializableはオブジェクトの状態に適用され、SomeClassがSomeInterfaceの状態の一部であることを暗示するためのここには何もありません。 https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

あなたはSomeClassが直列化復元されたとき、それはSerializableを実装するクラスを拡張しないことを訴えますか?

+0

'Serializable'は主にクラスの定義に適用されます。 'SomeClass'が' Serializable'でない場合は、シリアル化されません*ので、* de *直列化中に何が起こるかについて質問するためにアイドルです。 – EJP

-1

SomeClassのオブジェクトはその場にを単に作成されたときだけ

public class SomeInterfaceImpl implements SomeInterface { 

    @Override 
    public SomeClass getSomething(String someParameter) { 
     return new SomeClass(someParameter); 
    } 
} 

に似た何かがなぜあなたのプログラムがSomeInterfaceImplのシリアライズオブジェクトに失敗しなければならないんSomeInterfaceの実装を想定?

ミニマル例

Main.java

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Main { 

    public static void main(String[] args) { 

     try (final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
       final ObjectOutputStream out = new ObjectOutputStream(byteArrayOutputStream)) { 
      final SomeInterfaceImpl someInterfaceImpl = new SomeInterfaceImpl(); 
      final SomeClass something1 = someInterfaceImpl.getSomething("Test"); 
      out.writeObject(someInterfaceImpl); 

      try (final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); 
        final ObjectInputStream in = new ObjectInputStream(byteArrayInputStream)) { 
       final SomeInterface someInterface = (SomeInterface) in.readObject(); 
       final SomeClass something2 = someInterface.getSomething("Test"); 

       final String someParameter1 = something1.getSomeParameter(); 
       System.out.println(someParameter1); 

       final String someParameter2 = something2.getSomeParameter(); 
       System.out.println(someParameter2); 
      } catch (ClassNotFoundException ex) { 
       Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 
+0

実際に試しましたか?疑いの余地はありませんが、シリアライズとデシリアライズを最小限の例で追加しました。 – Smutje

0

いや、単に直列化可能であるクラス内で参照されるクラスは、デフォルトで直列化可能ではありません。

理想的javaNotSerializableExceptionをスローする必要がありますが、あなたは例外手段を取得されていませんので、によってSomeClassextends Serializableはどこか親階層です。

+0

または、それはnull、または直列化可能な派生クラスのインスタンスでした。 – EJP

関連する問題