自定义对象myClass:
public class myClass implements Serializable{
private static final long serialVersionUID = 1L;
private String name = "qiujie";
private  DataOutputStream dos;
public String getString(){
return name;
}
public DataOutputStream getDos() {
return dos;
}
public void setDos(DataOutputStream dos) {
this.dos = dos;
}
public void setname(String name)
{
this.name = name;
}
}
server端:
public class server {

public static void main(String[] args)
{
try {
ServerSocket server = new ServerSocket(8866);
System.out.println("system is running at localhost:8866");
Socket socket = server.accept();
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
myClass myclass = new myClass();
myclass.setname("yangfei");
myclass.setDos(dos);

ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(myclass);

} catch (Exception e) {
// TODO: handle exception
}

}

}
红色代码不设置时程序正常运行,是什么问题呢?
错误信息
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.DataOutputStream
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at com.testClient.client.main(client.java:25)
Caused by: java.io.NotSerializableException: java.io.DataOutputStream
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at com.hashmap.server.main(server.java:24)

解决方案 »

  1.   

    exception写得挺清楚的,java.io.DataOutputStream 不是Serializable的。
    当不加 private DataOutputStream dos 变量时,myClass 是一个正确的Serializable的类
      

  2.   

    我就是想知道如果要加上DataOutputStream,该怎么做呢
      

  3.   

    我没有明白的是为什么myClass里取得了你的servlet的outputstream了,然后又想把这个myClass写入这个servlet的outputstream。
    如果myClass代表了你想在客户端之间传送的信息,我觉得不应该在这里在DataOutputStream呀.
    如果myClass是代表了你的客户端,那似乎应该把想传送的信息写到DataOutputStream里.还是我理解的有问题?
      

  4.   

    传的那个类,要implements Serializable接口。。
      

  5.   

    你好 取得的那个outputstream是其中一个客户端的 然后我想把这个信息发给另外一个客户端, 问一下如果我想实现客户端直接通信该怎么做呢
      

  6.   

    myclass已经实现了Serializable接口阿
      

  7.   

    lz你qq多少 我有问题请教你 我qq:148167576 或者请贴上你的qq
      

  8.   

    啥子问题直接说 这里人更多呢 我[email protected]
      

  9.   

    请帮看下我的问题:
    http://topic.csdn.net/u/20120328/09/98640d8b-44bf-430b-9588-742ec964bab4.html?43763
      

  10.   

    首先你说你的myclass已经实现了Serializable接口是不完全的,仅仅implements Serializable还不行,还需要myclass里所有的attribute也都是Serializable才可以。你的代码里,myclass里有一个DataOutputStream没有实现Serializable,那么你整个的这个类就不是Serializable。另外,你想从Socket里取得信息,我觉得你应该用Socket.getInputStream 而不是 OutputStream最后,为了实现你的要求,读取一个socket的信息再传给另一个客户端。你可以建一个方法来读取InputStream的信息。然后把这些信息存到myclass里(注意需要是Serializable的类)。也就是说,把myclass里dos这个参数去掉,换成Serializable的参数。再把这个myclass写入OutputStream来传给另一个客户端
      

  11.   

    写了一个小例子,两个客户端之间直接通信的。也许是你的想法
    MyClass.javapublic class MyClass implements Serializable {
    String name;
    String message;
    int srcPort;
    public MyClass(){}
    public MyClass(String name, String message, int srcPort) {
    super();
    this.name = name;
    this.message = message;
    this.srcPort = srcPort;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getMessage() {
    return message;
    }
    public void setMessage(String message) {
    this.message = message;
    }
    public int getSrcPort() {
    return srcPort;
    }
    public void setSrcPort(int srcPort) {
    this.srcPort = srcPort;
    }
    }
    Client.java
    public class Client{
    ServerSocket server;
    Thread in;
    int port;
    boolean connect = true;
    public Client(int port){
    this.port = port;
    try {
    server = new ServerSocket(port);
    } catch (IOException e) {
    e.printStackTrace();
    }

    }

    void runReceiveThread(){
    in = new Thread(){
    @Override
    public void run() {

    while(connect){
    try {
    Socket inSocket = server.accept();
    InputStream ins = inSocket.getInputStream();
    ObjectInputStream data = new ObjectInputStream(ins);
    MyClass message = (MyClass)data.readObject();
    System.out.println(port + " receive a object :"+ message.getName() + " - " + message.getMessage() + " - " + message.getSrcPort());
    if(message.getMessage().equals("bye")){
    connect = false;
    }
    } catch (IOException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }
    }
    };
    in.start();
    }

    void sendMessage(final String m, final int p){
    try {
    Socket outSocket = new Socket(InetAddress.getLocalHost(), p);
    ObjectOutputStream outs = new ObjectOutputStream(outSocket.getOutputStream());
    MyClass toSend = new MyClass("Server" + port, m, port);
    outs.writeObject(toSend);
    System.out.println(port + " Send a object to " + p + " Content:" + toSend.getName() + " - " + toSend.getMessage() + " - " + toSend.getSrcPort());
    } catch (UnknownHostException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } }
    }main 程序 public static void main(String[] args) {
    Client c1 = new Client(7777);
    Client c2 = new Client(9999);
    c1.runReceiveThread();
    c2.runReceiveThread();
    c1.sendMessage("Hello c2, this is c1", 9999);
    c2.sendMessage("c1, this is c2", 7777);
    c1.sendMessage("how er you doing", 9999);
    c2.sendMessage("Go away", 7777);
    c1.sendMessage("bye", 9999);
    c2.sendMessage("bye", 7777);
    }
      

  12.   

    private DataOutputStream dos;
     流你都要序列化?