2017-05-18 9 views
0

で使用している場合ここで私は二つのクラスClientToSendCalculable.javaSerializableを外部クラスソケット

import java.io.*; 
import java.net.*; 

public class ClientToSendCalculable implements Serializable 
{ 
    public ClientToSendCalculable(int port) 
    { 
     try 
     (
      Socket s = new Socket("localhost", port); 
      ObjectOutputStream writer = new ObjectOutputStream(s.getOutputStream()); 
      ObjectInputStream reader = new ObjectInputStream(s.getInputStream()); 
     ) 
     { 
      System.out.println("Connection was established!"); 

      ClientToSendCalculable.Addition addition = new ClientToSendCalculable.Addition(); 
      addition.firstAddendum = 5; 
      addition.secondAddendum = 7; 

      writer.writeObject(addition); 
      double res = (Double)reader.readObject(); 

      System.out.println(res); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    private class Addition implements Calculable, Serializable 
    { 
     private double firstAddendum, secondAddendum; 

     public double calc() 
     { 
      return firstAddendum + secondAddendum; 
     } 
    } 

    public static void main(String[] args) 
    { 
     new ClientToSendCalculable(7777); 
    } 
} 

とServerToGetCalculable.java

import java.io.*; 
import java.net.*; 

public class ServerToGetCalculable 
{ 
    public ServerToGetCalculable(int port) 
    { 
     try 
     (
      ServerSocket ss = new ServerSocket(port); 
      Socket s = ss.accept(); 
      ObjectOutputStream writer = new ObjectOutputStream(s.getOutputStream()); 
      ObjectInputStream reader = new ObjectInputStream(s.getInputStream()); 
     ) 
     { 
      System.out.println("Got a client!"); 

      Calculable calcObj = (Calculable)reader.readObject(); 
      double res = calcObj.calc(); 

      writer.writeObject(res); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) 
    {new ServerToGetCalculable(7777);} 
} 

を持っている私の質問は、なぜClientToSendCalculable.javaはSerializableを実装しなければならないのですか?私はソケットを介してその内部クラスのAddition.javaだけを送信しますが、私はClientToSendCalculable.javaを単独で送信しません。唯一のAddition.javaはシリアライズした場合、それは十分だろうという私のためと思われる理由ですが、私はSerializableをClientToSendCalculable.javaをない作る場合、私はこのコード行を実行しようとする例外を取得:

writer.writeObject(addition); 
+0

追加は、内部クラス(静的ではない) - >囲むClientToSendCalculableインスタンスへの参照を保持するフィールドを含んでいます。 – Nevay

+0

@Nevay、どうすればリファレンスを取得できますか? – Yaroslav

+0

@Nevay、ok。私はそれを発見した:入れ子にされたクラスは、その囲むクラスのメンバーです。静的でないネストされたクラス(内部クラス)は、それらがプライベート宣言されていても、囲むクラスの他のメンバーにアクセスできます。静的なネストされたクラスは、囲むクラスの他のメンバーにアクセスすることはできません。 OuterClassのメンバーとして、ネストされたクラスはprivate、public、protected、またはpackage privateとして宣言できます。 (外部クラスはpublicまたはpackage privateのみ宣言できます)。 – Yaroslav

答えて

2

追加.javaは、内部クラス(非静的)です。 - それは、囲むClientToSendCalculableインスタンスへの参照を保持するフィールドを含んでいます。>外部クラスのフィールドをシリアル化する必要があります。> Serializableインターフェイスを実装する必要があります。

関連する問題