ObjectOutputStream无法写入我的对象

时间:2016-04-11 15:58:40

标签: java sockets serializable objectinputstream objectoutputstream

我正在使用socket创建一个群聊项目,但是无法将我的Message对象写入socket objectOutputStream。服务器端objectInputStream什么都没找到(avalible = 0)。我试着冲洗但它不起作用。请帮帮我。

enum MessageStatus implements Serializable {Mess, Offline};
public class Message implements Serializable{
String mess;
String senderName;
int senderID;
MessageStatus type;

public Message(String mess, int SenderID, String SenderName) {
    this.mess = mess;
    this.senderID = SenderID;
    this.senderName = SenderName;
}

我试着这样写:

Message msg = new Message(txtChat.getText().trim(), user.id,    user.name);
msg.type = MessageStatus.Mess;
try {
        user.Output.writeObject(msg);
        user.Output.flush();

我的套接字没问题,我试图写一些字符串或int,但它可以工作,但不是我的对象。 我试图将它作为服务器端套接字对象输入流中的消息或对象,但它抛出.ClassNotFoundException 我认为我的对象没有被写入socket

1 个答案:

答案 0 :(得分:1)

不要依赖available()知道是否有东西要加载它确实只返回可以无阻塞地读取的字节数。

如果我这样做,请使用您的代码:

    Message msg = new Message("Hello", 123, "world");
    System.out.printf("Before serialization = %s%n", msg);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
    oos.writeObject(msg);
    oos.flush();
    oos.close();
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(byteArrayInputStream);
    System.out.printf("available = %d%n", ois.available());
    Message message = (Message) ois.readObject();
    System.out.printf("After deserialization = %s%n", message);
    ois.close();

输出结果为:

Before serialization = Message{mess='Hello', senderName='world', senderID=123, type=Mess}
available = 0
After deserialization = Message{mess='Hello', senderName='world', senderID=123, type=Mess}

我可以看到邮件已正确序列化和反序列化,但仍然available返回0,这证明了您必须不相信available这样的需求。