实现序列化时要确保哪些关键点

时间:2011-03-01 19:58:06

标签: java serialization

在java中实现良好的序列化时要检查的核对表有哪些关键点(我不是真的在寻找,实现Serializable,write,readObject等)。

相反,如何减小对象的大小,可能如何以zip格式制作对象并通过网络发送等。 如何确保安全的转移方式。 像这样的任何其他人..

3 个答案:

答案 0 :(得分:0)

如何减小对象的大小:new ObjectOutputStream(new GZipOutputStream(new BufferedOutputStream(out))。但这是一个时空权衡。你可能会发现它通过增加延迟使性能变差。

如何确保安全的传输模式:SSLSocket或HTTPS URL。

  

像这样的任何其他人

还有其他人喜欢什么?你需要具体。

答案 1 :(得分:0)

  • 使用序列化来“持久化”对象 - 这使得模式管理(即更改构成类的状态)几乎不可行

  • 始终声明serialVersionUID字段;否则你将无法以任何方式添加方法或更改类(甚至是非状态更改的类),而旧版本的代码无法反序列化对象(将抛出IncompatibleClassVersionError)< / p>

  • 如果要反序列化类的逻辑“枚举”实例(typesafe枚举模式),请尝试覆盖readResolve

  • 确保您对构成班级状态的变量名称100%满意。一旦序列化了实例,就无法更改变量名称

  • 除非您真的需要

  • ,否则不要实施Serializable
  • 不要创建接口Serializable - 实现类可能是,但接口不应该是

  • 不要将序列化作为传递对象的方式的一部分,除非您是对象的唯一生产者和使用者(例如服务器GUI通信)。改为使用二进制/有线协议(例如 protobuf

  • 为了最大限度地减少通过电线发送的内容,您可以使用调配。也就是说,也许你有一个Product类;序列化表单可能只是一个唯一的int id字段。然后可以根据需要建立所有其他方法来构建相关状态(可能作为数据库调用,或调用某些中央服务)

  • 如果要序列化包含某些集合元素作为其状态一部分的对象,请确保在集合中synchronize。否则,您可能会发现有人在序列化时修改了集合,从而产生ConcurrentModificationException

答案 2 :(得分:0)

  

可能如何以zip格式制作对象并通过网络发送等。

了解网络游戏的游戏开发者如何实施网络。他们知道如何快速传输数据。看看例如http://code.google.com/p/kryonet/

  

如何确保安全的转移模式。像这样的任何其他人..

安全模式有很多解释。如果需要可靠性,请使用TCP,否则使用UDP。如果你需要加密使用TLS,否则rot13可能适合。如果需要确保完整性,请将值的哈希值附加到消息中。

  

如何减小对象的大小,

分析您的数据并删除对象,以便您只拥有必要的数据。这是特定于上下文的,因为最佳优化可以在域中。例如。您可以检查,是否可以仅发送更改的增量。

这是一个有趣的问题,但您必须更加具体地了解您的目标或领域,以获得最适合的答案。