Java 通过套接字发送可序列化对象时发生NotSerializableException?

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

我正在尝试通过套接字连接发送自定义对象。该类实现了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;
   }
}
}

新的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)