当类实现Serializable接口时,为什么会得到java.io.NotSerializableException?

当类实现Serializable接口时,为什么会得到java.io.NotSerializableException?,java,serialization,Java,Serialization,当我试图用调用对对象进行序列化时,stashCon.stash()我得到java.io.NotSerializableException,即使类stashCon实现了Serializable接口 这可能是什么原因 public boolean connect(String username,String password) { try { Openfire.connection.connect(); Openfire.connection.login(us

当我试图用调用对对象进行序列化时,
stashCon.stash()
我得到
java.io.NotSerializableException
,即使类
stashCon
实现了
Serializable
接口

这可能是什么原因

public boolean connect(String username,String password) {
    try {
        Openfire.connection.connect();
        Openfire.connection.login(username,password);
        stashCon = new StashCon(Openfire.connection);
        stashCon.stash(); // CALL THAT ATTEMPTS TO SERIALIZE THE OBJECT
    }catch(Exception exc){
        exc.printStackTrace();
        return false;
    }
    return true;
}
以下方法属于
stathcon

例外情况


XMPPConnection与所在机器上的物理资源(TCP套接字)耦合,因此无法使其可序列化。它还有一个与服务器连接相关联的标识,该标识不可复制,因为完整JID只能连接到同一台服务器一次,第二次连接将迫使另一台服务器断开连接


不应将连接放入会话中,您必须在该范围之外对其进行管理。

您的对象包含本身不可序列化的成员变量(org.jivesoftware.smack.XMPPConnection的实例)

如果你真的想序列化你的对象,你必须对这个成员变量做些什么。一个选项是将该变量声明为
transient
,这样它就不会被序列化

但是,在反序列化时,您必须处理该成员(如重新建立连接)。为此,可以定义反序列化期间调用的方法
readObject
。在那里,您可以(而且可能应该)初始化所有临时成员变量,以将对象设置为良好状态


这也是讨论序列化的一个好问题。

当我需要重用另一个类中的
连接
对象时,我该怎么做?重新连接将使应用程序在各种情况下运行缓慢在同一JVM中传递连接对象。序列化既不是必需的,也不是可能的。该类只有一个成员,它是不可序列化的类
XMPPConnection
的实例。在连接完成一次后,如何重用连接对象?让用户在各种情况下再次登录会使应用程序运行缓慢。首先,为什么要将数据序列化到文件中?我想你有一个很好的理由去序列化。如果您只需要保持连接,那么将其存储在某个单例实例或静态成员中,您可以在程序运行时访问它。如果希望在程序未运行时保持连接,以便稍后在不提示输入密码的情况下重新连接,则序列化不是一个好的解决方案。要做到这一点,您必须存储用户名和密码,这将危及您用户的帐户安全。您无法序列化连接,这没有意义。@EJP,如果您可以详细说明并将其作为答案发布
public void stash() {
    try {
        FileOutputStream outputStream = new FileOutputStream(new File(Constants.BLAB_CONNECTION_FILE));
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(this); // LINE 33
        objectOutputStream.close();
        outputStream.close();
    }catch(Exception exc) {
        exc.printStackTrace();
    } 
}
java.io.NotSerializableException: org.jivesoftware.smack.XMPPConnection
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
at blab.StashCon.stash(StashCon.java:33)
at blab.Openfire.connect(Openfire.java:27)
at blab.ext.gui.SignIn$4.run(SignIn.java:214)
at java.lang.Thread.run(Thread.java:619)