Java 通过套接字发送可序列化对象时发生NotSerializableException?
我正在尝试通过套接字连接发送自定义对象。该类实现了serializable,但是当我试图将对象写入套接字时,构造函数仍然抛出一个Java 通过套接字发送可序列化对象时发生NotSerializableException?,java,sockets,serialization,objectoutputstream,Java,Sockets,Serialization,Objectoutputstream,我正在尝试通过套接字连接发送自定义对象。该类实现了serializable,但是当我试图将对象写入套接字时,构造函数仍然抛出一个NotSerializableException。我将在下面发布相关代码: public class serilizableArrayHolder implements Serializable { private ArrayList<Client> array= null; public serilizableArrayHolder(Arra
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;
}
}
}
新的stacktrace:
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)
可通过
serilizableArrayHolder
访问的所有类都必须是可序列化的
,包括您的客户端
类
您的客户端
类包含套接字
,线程
,数据输入流
,数据输出流
和对象输出流
成员。它们都不是可序列化的。这就是为什么不能序列化客户机
类。还有一个
我认为您应该重新思考您的设计,并与大家分享您为什么要序列化这些对象。所有通过
serilizableArrayHolder
可以访问的类都必须是可序列化的
,包括您的客户端
类
您的客户端
类包含套接字
,线程
,数据输入流
,数据输出流
和对象输出流
成员。它们都不是可序列化的。这就是为什么不能序列化客户机
类。还有一个
我认为您应该重新思考您的设计,并分享您为什么要序列化这些对象。异常告诉您问题所在。您的
客户端
类不可序列化。要序列化一个对象,它引用的所有对象(等等,传递的)也需要是可序列化的。如果不想序列化引用,可以将其标记为瞬态引用。异常会告诉您问题所在。您的客户端
类不可序列化。要序列化一个对象,它引用的所有对象(等等,传递的)也需要是可序列化的。如果不想序列化引用,可以将其标记为transient。类Gesäll.Client
不可序列化。整个serilizableArrayHolder
类需要可序列化。类Gesäll.Client
不可序列化。整个serilizableArrayHolder
类需要是可序列化的。谢谢。我现在已经使客户机类也可序列化,但它仍然抛出相同的错误。据我所知,ArrayList不可序列化,这可能会导致错误。在创建arraylist时,我确实尝试使其成为瞬态,但仍然生成一个exception@JimmyGustafsson:ArrayList
是可序列化的,请检查。也发布您的客户机类。@Jimmy Gustafsson如果您收到相同的异常和消息,您没有部署该类的可序列化版本。如果在新消息中出现相同的异常,它将命名另一个不可序列化的类。据我所知,我的客户端类和serilizableArrayHolder都应该是SerilizableThank。我现在已经使客户机类也可序列化,但它仍然抛出相同的错误。据我所知,ArrayList不可序列化,这可能会导致错误。在创建arraylist时,我确实尝试使其成为瞬态,但仍然生成一个exception@JimmyGustafsson:ArrayList
是可序列化的,请检查。也发布您的客户机类。@Jimmy Gustafsson如果您收到相同的异常和消息,您没有部署该类的可序列化版本。如果在新消息中出现相同的异常,它将命名另一个不可序列化的类。据我所知,我的客户机类和serilizableArrayHolder都应该是serilizablewell,我试图完成的只是将arrayList从服务器发送到客户机。为了澄清这一点,我目前的设计是,当用户使用我的主应用程序连接到服务器时,服务器创建类客户机的实例,并将“客户机”实例添加到ArrayList中。然后,该arraylist将包含对所有“在线”客户端的引用。就目前而言,我的serilizableArrayHolder只接受ArrayList,但我的计划是让它变得通用,也接受其他对象。为什么要将ClientList发送给客户端?你的客户必须相互沟通吗?如果他们这样做了,他们应该点对点还是通过服务器来做呢?嗯,我所要做的就是将arrayList从服务器发送到客户端。为了澄清这一点,我目前的设计是,当用户使用我的主应用程序连接到服务器时,服务器创建类客户机的实例,并将“客户机”实例添加到ArrayList中。然后,该arraylist将包含对所有“在线”客户端的引用。就目前而言,我的serilizableArrayHolder只接受ArrayList,但我的计划是让它变得通用,也接受其他对象。为什么要将ClientList发送给客户端?你的客户必须相互沟通吗?如果他们这样做了,他们应该点对点还是通过服务器?
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");
}
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)