【问题标题】:Sending objects via java sockets通过 java 套接字发送对象
【发布时间】:2014-01-11 17:33:12
【问题描述】:

我正在尝试使用 java 套接字发送以下类的对象:

public class CommunicationObj implements Serializable{
    private String ID;
    public AuthenticationParams s = new AuthenticationParams();
    public CommunicationObj(String s){
        ID = s;
    }
    public String getID(){
        return ID;
    }
}

但发送以下类的对象会引发异常(无法发送对象),但以下代码有效

public class CommunicationObj implements Serializable{
    private String ID;

    public CommunicationObj(String s){
        ID = s;
    }
    public String getID(){
        return ID;
    }
}

为什么AuthenticationParams 对象会在这里产生这样的问题?任何帮助将不胜感激。 注意:所有使用的类和包都与服务器和客户端相同。

【问题讨论】:

  • AuthenticationParams 是否也可序列化?
  • 以后使用代码按钮 - “{}” - 格式化您的代码,而不是 <code> 标记。
  • VincentRamdhanie,这解决了问题 :)

标签: java sockets object serialization


【解决方案1】:

如果AuthenticationParamsAuthenticationParams 本身的任何部分未标记为可序列化,您的序列化将失败。

事实上,你的类的每个部分的每个部分都必须是可序列化的,或者由于某种原因不能序列化的字段应该被赋予transient修饰符,这表明该对象不应该包含在序列化过程中。

【讨论】:

    【解决方案2】:

    AuthenticationParams 类可能无法序列化。您可以添加 transient 修饰符以将其从序列化中丢弃,例如:

    public transient AuthenticationParams s = new AuthenticationParams();
    

    但是如果你想在序列化表单中包含这个对象,那么你别无他法,只能让 AuthenticationParams 类可序列化。

    序列化规则:从实例(您要序列化的对象实例)引用的所有非瞬态对象也必须是可序列化的。

    不是:你可以利用 java.io.Externalizable 接口来开发你的自定义序列化机制。

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 2012-08-29
      • 2012-03-13
      • 2015-08-31
      • 2014-03-24
      • 2017-03-20
      • 1970-01-01
      • 2019-04-21
      相关资源
      最近更新 更多