Java 实现序列化时需要确保的关键点是什么

Java 实现序列化时需要确保的关键点是什么,java,serialization,Java,Serialization,在java中实现良好的序列化时,检查清单中的关键点是什么(我不是真的在寻找,实现Serializable、write、readObject等) 相反,如何减小对象的大小,可能是如何使对象采用zip格式并通过网络发送等。。 如何确保安全的传输模式。 其他类似的..如何减小对象的大小:new ObjectOutputStream(new GziOutputStream(new BufferedOutputStream(out))。但这是一种空间-时间权衡。您可能会发现,增加延迟会使性能变差 如何确保

在java中实现良好的序列化时,检查清单中的关键点是什么(我不是真的在寻找,实现Serializable、write、readObject等)

相反,如何减小对象的大小,可能是如何使对象采用zip格式并通过网络发送等。。 如何确保安全的传输模式。
其他类似的..

如何减小对象的大小:new ObjectOutputStream(new GziOutputStream(new BufferedOutputStream(out))。但这是一种空间-时间权衡。您可能会发现,增加延迟会使性能变差

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

还有像这样的吗

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

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

  • 始终声明一个
    serialVersionUID
    字段;否则您将无法添加方法或以任何方式更改类(即使是非状态更改的类),而旧版本的代码无法反序列化对象(将抛出一个
    不兼容的ClassVersionError

  • 如果要反序列化类的逻辑“枚举”实例(类型安全枚举模式),请尝试并重写
    readResolve

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

  • 不要实现可序列化的

  • 不要使接口可序列化——实现类可以是,但接口不应是

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

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

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

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

看看网络游戏的游戏开发者是如何实现联网的。他们知道如何快速传输数据

如何确保传输的安全模式。还有其他类似的吗

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


如何减小对象的大小

分析您的数据并剥离对象,以便您在其中只包含必要的数据。这是非常特定于上下文的,因为最佳优化可以在域中进行。例如,您可以检查是否可以只发送更改的增量


这是一个有趣的问题,但你必须更具体地说明你的目标或领域,才能得到最合适的答案。

你具体想做什么?针对不同的情况有不同的策略。阅读有效的Java-有一整章关于序列化。看看RMI、Hessian、Burlap……还有对远程处理的支持例如,在Spring框架中。不要重新发明轮子。引用如下:“阅读有效的Java-有一整章都是关于序列化的。”——@Bozho。我完全同意这一点。