Fields in a "Serializable" class should either be transient or serializable序列化

Fields in a Serializable class must themselves be either Serializable or transient even if the class is never explicitly serialized or deserialized. That's because under load, most J2EE application frameworks flush objects to disk, and an allegedly Serializable object with non-transient, non-serializable data members could cause program crashes, and open the door to attackers.


如果这个类被序列化了,那么类中的字段也应该被序列化,如果该对象明确不能被序列化或者反序列化则应该将对象声明成transient。

那是因为在负载的情况下,大多数的J2EE应用程序框架都会将对象刷新到磁盘,如上所述一个没有声明成transient或者没有被序列化的对象会数据对象会导致程序出错,甚至会打开被外界攻击的大门。

当抛出此类问题时候,可以按照以下几个步骤解决:

解决方法:
方法1:序列化该对象
方法2:当采用struts2框架开发,不可避免的此问题会大量出现,因为ActionSupport实现了序列化接口,action继承了此类,而service没序列化,所以在action中引用service对象时提示此错误,最简单的解决方法是将service对象声明成transient,即service不需要序列化
方法3(未验证):To avoid java serialization you need to implement writeObject() and readObject() method in your Class and need to throw NotSerializableException from those method.(action中实现这两个方法?)
private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
    throw new java.io.NotSerializableException( getClass().getName() );
}
private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException {
    throw new java.io.NotSerializableException( getClass().getName() );
}




你可能感兴趣的:(sonarque,java)