`

java Serializable 一些细节

 
阅读更多

1)通过网络传输的对象,必须实现Serializable接口,或者父类已经实现序列化接口。

(2)网络传输对象封装太多层次的父类不太好,或者说在interface上用父类定义,然后将子类实例传递给网络另一端的应用可能没这个 jar包/class,反序列化不了的。另一可能情况,动态代理接口InvocationHandler invoke(Object proxy, Method method, Object[] args),传进时,method的参数定义匹配interface上的method参数定义,比如是父类,从args获取的class是子类,如果某种 rpc技术处理不当,或无从识别,困扰的是使用者。

(3)网络接口上的参数、返回值类型、会抛出的异常类,都要实现序列化接口。包括层层里面装着的内容,父类(比较少人对这field推敲private/protected,父类可能有直接被使用的时候)。

(4)ArrayList.subList()返回的List实现类是内部类型,不能序列化的,通过网络传输会出错。

(5)网络对象第一次上线使用时,就要设定serialVersionUID,不要不顾编译警告

网络对象的匹配,除了靠类名,还靠serialVersionUID,serialVersionUID在《Java语言规范》有固定算法,跟各field的定义相关,如果没有显式赋值,虽然看不见,但会底下会默认算出一个进行网络传输。

如果没有显式赋值,也在你看不见觉察不到的情况下,在你增减了field/修改了定义的情况下,serialVersionUID已被改 变,这时网络两端就对接不上而悲剧了。没定义serialVersionUID,而又发生了serialVersionUID变化,网络两端只有所有机器 都停掉,并且先后起有顺序时,才能不出丝毫差错。

(6)网络传输对象要有无参构造器,因为机器系统是不知道传什么内容给有参构造器进行实例化,无参构造器不是public都没关系。没定义无参构造器,有些序列化方式会在底下生成无参构造器的方式才能解决问题。

(7)网络传输最好不要用enum类型,太强耦合,从网络一端传到另一端,对方可能还是旧版本而识别不了。别人文章里有enum的序列化说明

(8)有的人喜欢用1L作为serialVersionUID,但不知道是否是通配值,一开始就有赋值肯定没错,0L对于java enum的序列化有特殊意义。

(9)看看HashMap、Date的源代码,不需通过网络传输的field用transient定义,然后实现writeObject等方法。不是所有场合都识别Externalizable,或许都要此场合特别支持Externalizable才行。

(10)有些系列化格式,遇到反序列化不了的类,会反序列化成Map,但会在使用时遇到class cast异常。

(11)不用抛客户端没有jar的异常类到客户端

(12)同一应用不要有同package同名类,即使隐藏在同名/不同名/不同版本的jar中。

(13)远程调用、分布式调用,分布式缓存等,或许都需要经过序列化,虽然让你透明地使用网络/感觉不到。

(14)不要序列化大数据对象/十分复杂对象,一般long/int/String/Map/List/Array等常见类组成的对象就已能解决问题,最好不要在本应用的业务接口传递/返回另一人主导业务/结构的对象。 不是建议不要用ArrayList,只是要注意ArrayList经过网络后可能顺序不一样。两需一一对应的List,经过网络后不一定一一对应。List中有零星的null,可能会给别人造成麻烦。

 
分享到:
评论

相关推荐

    Java 串行化(序列化)Serializable/Externalizable

    1. **默认序列化**:简单地实现Serializable接口,无需额外代码,适合字段较少且不关心序列化细节的场景。 2. **自定义序列化**:通过实现Externalizable接口,自定义序列化和反序列化逻辑,适合需要优化性能或有...

    可序列化接口Serializable

    本文将深入探讨`Serializable`接口的细节,以及与其相关的高级知识。 `Serializable`接口是Java中的一个标记接口,没有包含任何方法。当你在一个类上声明实现了这个接口,你实际上是在告诉JVM(Java虚拟机)该类的...

    Java序列化(Serializable)与反序列化_.docx

    ### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...

    Java语言细节问题大全.rar

    这份名为"Java语言细节问题大全.rar"的压缩包文件,显然为开发者提供了一份全面的Java编程指南,涵盖了从基础到高级的各类问题。下面将详细讨论其中可能包含的知识点。 1. 文件系统操作: 在Java中,`java.io`和`...

    java串行化详细的介绍了java串行化的概念

    这些文档详细介绍了序列化的基本原理、实现细节以及版本控制策略等内容。 #### 九、总结 序列化是Java编程中一项重要的技术,它能够帮助开发者实现对象的持久化和网络传输等功能。通过理解序列化的原理和实现机制...

    java版QQ聊天室

    为了实现消息的序列化和反序列化,Java的序列化API(java.io.Serializable)可能会被用到,这使得对象可以在网络间传递。另外,JSON或XML格式也可能用于数据交换,因为它们具有良好的可读性和广泛的兼容性。 最后,...

    java九阴真经.doc

    在本文中,我们将详细探讨Java语言的一些关键知识点,包括但不限于基本语法、面向对象特性、异常处理、集合框架、多线程以及I/O流等内容。 首先,Java的基础语法是学习Java的第一步。这包括变量、数据类型(如基本...

    Practical Java(简体中文)

    《Practical Java》和《Effective Java》正是这样两部著作,它们对Java的重要而基础的技术细节进行了详尽、深刻的介绍和剖析,每个主题独立成章,既方便读者根据需求选择性阅读,又能彼此呼应,形成一个完整的学习...

    java实现logistic回归算法

    - **模型保存与加载**:使用序列化技术如Java的Serializable接口保存和加载模型。 4. **Java库的使用** - **Apache Commons Math**:提供了一些数学工具,如矩阵运算、优化算法等,适合实现Logistic回归。 - **...

    飞鸽java版.zip

    在本文中,我们将深入探讨这个项目的核心技术、实现细节以及它所涵盖的Java编程知识点。 首先,让我们从Java语言的基础开始。Java是一种跨平台的面向对象的编程语言,以其“写一次,到处运行”的特性而闻名。在这个...

    java实现的QQ

    3. **数据序列化与反序列化**:Java的Serializable接口用于对象的序列化,使对象能在网络间传输。而反序列化则是将接收到的数据恢复为原来的对象。 4. **用户认证与授权**:实现登录功能时,会涉及到用户身份验证,...

    java中所有类的源代码

    - **sunw**: 这可能是Sun Microsystems(现在是Oracle的一部分)的私有包,包含一些特定于Sun JDK的实现细节。 2. **类(Class)与接口(Interface)**: - Java中的类是面向对象编程的基本构建块,用于封装数据...

    java socket使用加密协议传输对象

    然而,正确配置和使用SSL/TLS协议并不总是直观的,需要对协议细节和Java安全框架有一定的了解。在实际应用中,开发者应密切关注最新的安全标准和最佳实践,以确保其应用程序能够在不断演变的威胁环境中保持安全。

    java单聊群聊案例

    5. **数据序列化与反序列化**:Java的Serializable接口用于对象的序列化,将对象转换为字节流,以便在网络中传输。在聊天系统中,可能需要将消息对象转换为字符串再发送。 6. **设计模式**:在构建这类系统时,可能...

    JAVA Bean 课程.rar_Java bean

    - **序列化**:为了支持持久化,Java Bean应该实现`Serializable`接口,这样对象的状态就可以保存到磁盘并稍后恢复。 - **属性通知**:Bean可以提供`propertyChangeSupport`机制,当属性改变时通知监听者。 - **...

    java自动更新小例子

    可以创建一个版本类,包含版本号、发布日期等信息,并使用序列化技术(如`java.io.Serializable`接口)将其保存到本地文件,以便下次启动时读取。 在实际开发中,自动更新系统可能还需要考虑更多的细节,比如错误...

    基于JAVA的俄罗斯方块

    下面将详细讲解JAVA在构建这款游戏中的关键知识点以及实现细节。 首先,JAVA作为面向对象的编程语言,是开发游戏的理想选择。在这款俄罗斯方块游戏中,每个方块、游戏面板、计分系统都可以被封装为独立的类。例如,...

    面试java、面试java 面试java

    以下是一些常见的Java面试知识点: 1. **面向对象的三大特性**: - **封装**:是面向对象的核心特征之一,它隐藏了对象的内部细节,只对外提供公共接口来访问和操作。通过访问修饰符(如`private`、`public`等)来...

    Practicla Java.pdf(简体中文版)

    - **Cloneable与Serializable接口**:分别用于克隆对象和序列化对象,是Java中重要的接口之一。 - **平等性与不可变性**:探讨如何正确判断对象的相等性,以及如何创建不可变对象。 - **多线程与同步**:涉及线程...

Global site tag (gtag.js) - Google Analytics