Java序列化

我怀疑我遇到过阅读Effective Java。如果它是一个真正简单而直截了当的疑问,我道歉。因此,在第74项 - 明智地实施Serializable中,他说,即使在使用私有和私有领域实施一个好的信息隐藏在你的班级之后,它也很容易失去效力?无论我过去读过什么,所有序列化都是将对象转换为字节流形式,反序列化后保留相同的对象。如何在此过程中丢失数据隐藏?     
已邀请:
您可以使用序列化和反序列化访问对象内部状态的值。 通过序列化对象,您可能能够读取您不应该访问的私有字段的值。相反,如果您创建一个精心设计的字节数组,并将其反序列化为实例,则可以将其初始化为非法状态。     
@candiru指出了OOP上下文中序列化的数据隐藏问题。 但序列化还有另一个方面。 您可以通过网络发送序列化文件,以便它可以被窥视,并且应该是私有的东西很容易受到损害。 下面是我序列化的Bean类的内容(使用默认技术)。我可以通过在文本编辑器中打开序列化文件来查看内容。
’ sr SerializationPractice1        I ageL extrat Ljava/lang/String;L nameq ~ xp
pt SidKumarq ~ x
现在你可以在不知道课程的情况下轻松找到下面的内容: 类名:SerializationPractice1 名为name的字符串属性是SidKumar 你肯定会注意到这些事情;其他细节不太清楚。以上信息是正确的。     
我相信序列化有可能将私人数据暴露给外界。这就是外部化(使用Externalizable类型实例非常方便)。通过实现Externalizable接口的writeExternal(...)方法,开发人员可以完全控制序列化过程,而不是完全依赖于默认的序列化运行时实现。下面是我的想法的伪代码(我会忽略实际的方法签名,因为它只是一个伪代码,旨在涵盖更广泛的想法):
    class SensitiveData implemets java.io.Externalizable{

       int sensitiveInteger;
       writeExternal (OutputData outputData){
          //encrypt sensitiveInteger here
          //serialize the sensitiveInteger which is now encrypted to any persistent store
          outputData.writeInt(sensitiveInteger);
          //do other processing
    }
 }
事实上,为什么只是加密,我们可能希望将序列化的字节压缩到某个持久存储,如果我们想要在某些情况下序列化的实例是“大”。     

要回复问题请先登录注册