Joh*_*now 1 java sockets serialization objectoutputstream
我试图通过套接字连接发送定制的对象.该类实现了serializable,但构造函数仍然NotSerializableException在尝试将对象写入套接字时抛出.我将在下面发布相关代码:
public class serilizableArrayHolder implements Serializable {
private ArrayList<Client> array= null;
public serilizableArrayHolder(ArrayList<Client> array) {
this.array=array;
}
public ArrayList<Client> getArray() {
return array;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我定制的课程.现在我试图从服务器发送一个arraylist到客户端,但我会在稍后阶段添加其他信息.send方法发布在我的服务器类下面,发布如下:
public void sendData(Socket clientSocket){
ObjectOutputStream out;
try {
serilizableArrayHolder temp = new serilizableArrayHolder(clientCollection);
out = new ObjectOutputStream(clientSocket.getOutputStream());
out.writeObject(temp); <---This line generates the error.
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我从服务器发送的方法.clientCollection是我试图发送的arrayList.
整个Client类:
public class Client implements Runnable, Serializable{
public Thread thread = new Thread(this);
private Socket s;
private DataInputStream in;
private DataOutputStream out;
private ObjectOutputStream objOut;
private ServerMain server=null;
private String host=null;
private Client c;
private String userName;
public Client(Socket s, String host, ServerMain server) throws IOException{
c=this;
this.host=host;
this.s=s;
this.server=server;
this.userName=userName;
in= new DataInputStream(s.getInputStream());
out=new DataOutputStream(s.getOutputStream());
objOut=new ObjectOutputStream(s.getOutputStream());
thread.start();
}
public String getClientInfo(){
return host;
}
public String getUserName(){
return userName;
}
public void send(String s){
try {
out.writeUTF(s);
}
catch (IOException e){
}
}
public void run() {
while(true){
try {
String temp = in.readUTF();
if(temp.equals("sendOnline")){
sendOnline();
}
String tempHost=s.getInetAddress().getHostAddress();
server.appendString(tempHost+" Skickade: "+temp+"\n");
}
catch (IOException e) {
String str = s.getInetAddress().getHostName();
server.clientDisconnect(str);
break;
}
}
try {
s.close();
}
catch (IOException e) {
}
}
public void sendOnline(){
serilizableArrayHolder temp = new serilizableArrayHolder(server.getClients());
try {
objOut.writeObject(temp);
objOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Metoden anropas");
}
Run Code Online (Sandbox Code Playgroud)
}
新的堆栈跟踪:
java.io.NotSerializableException: java.io.DataInputStream
Metoden anropas
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at java.util.ArrayList.writeObject(ArrayList.java:710)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at Gesäll.Client.sendOnline(Client.java:83)
at Gesäll.Client.run(Client.java:58)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)
例外情况告诉你问题.你的Client班级不可序列化.要序列化对象,它引用的所有对象(以及传递等)也需要可序列化.transient如果您不希望序列化,可以标记引用.
| 归档时间: |
|
| 查看次数: |
2477 次 |
| 最近记录: |