快速业务通道

关于Java对象序列化您不知道的5件事 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
  }    public String getFirstName() { return firstName; }    public String getLastName() { return lastName; }    public int getAge() { return age; }    public Person getSpouse() { return spouse; }    public void setFirstName(String value) { firstName =  value; }    public void setLastName(String value) { lastName =  value; }    public void setAge(int value) { age = value; }    public void setSpouse(Person value) { spouse = value;  }    private void writeObject(java.io.ObjectOutputStream stream)      throws java.io.IOException    {      // "Encrypt"/obscure the sensitive data      age = age << 2;      stream.defaultWriteObject();    }    private void readObject(java.io.ObjectInputStream stream)      throws java.io.IOException, ClassNotFoundException    {      stream.defaultReadObject();      // "Decrypt"/de-obscure the sensitive data      age = age << 2;    }    public String toString()    {      return "[Person: firstName=" + firstName +        " lastName=" + lastName +        " age=" + age +        " spouse=" + (spouse!=null ? spouse.getFirstName() : "[null]")  +        "]";    }    private String firstName;    private String lastName;    private int age;    private Person spouse; }

如果需要查看被模糊化的数据,总是可以查看序列化数据流/文件。而且,由 于该格式被完全文档化,即使不能访问类本身,也仍可以读取序列化流中的内容 。

关于Java对象序列化您不知道的5件事(5)

时间:2010-11-20 IBM Ted Neward

3. 序列化的数据可以被签名和密封

上一个技巧假设您想模糊化序列化数据,而不是对其加密或者确保它不被修 改。当然,通过使用 writeObject 和 readObject 可以实现密码加密和签名管 理,但其实还有更好的方式。

如果需要对整个对象进行加密和签名,最简单的是将它放在一个 javax.crypto.SealedObject 和/或 java.security.SignedObject 包装器中。 两者都是可序列化的,所以将对象包装在 SealedObject 中可以围绕原对象创建 一种 “包装盒”。必须有对称密钥才能解密,而且密钥必须单独管理。同样, 也可以将 SignedObject 用于数据验证,并且对称密钥也必须单独管理。

结合使用这两种对象,便可以轻松地对序列化数据进行密封和签名,而不必 强调关于数字签名验证或加密的细节。很简洁,是吧?

4. 序列化允许将代理放在流中

很多情况下,类中包含一个核心数据元素,通过它可以派生或找到类中的其 他字段。在此情况下,没有必要序列化整个对象。可以将字段标记为 transient ,但是每当有方法访问一个字段时,类仍然必须显式地产生代码来检查它是否被 初始化。

如果首要问题是序列化,那么最好指定一个 flyweight 或代理放在流中。为 原始 Person 提供一个 writeReplace 方法,可以序列化不同类型的对象来代替 它。类似地,如果反序列化期间发现一个 readResolve 方法,那么将调用该方 法,将替代对象提供给调用者。

打包和解包代理

writeReplace 和 readResolve 方法使 Person 类可以将它的所有数据(或 其中的核心数据)打包到一个 PersonPro

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号