で使用している場合ここで私は二つのクラス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);
追加は、内部クラス(静的ではない) - >囲むClientToSendCalculableインスタンスへの参照を保持するフィールドを含んでいます。 – Nevay
@Nevay、どうすればリファレンスを取得できますか? – Yaroslav
@Nevay、ok。私はそれを発見した:入れ子にされたクラスは、その囲むクラスのメンバーです。静的でないネストされたクラス(内部クラス)は、それらがプライベート宣言されていても、囲むクラスの他のメンバーにアクセスできます。静的なネストされたクラスは、囲むクラスの他のメンバーにアクセスすることはできません。 OuterClassのメンバーとして、ネストされたクラスはprivate、public、protected、またはpackage privateとして宣言できます。 (外部クラスはpublicまたはpackage privateのみ宣言できます)。 – Yaroslav