基础概念

  • 把对象等转为二进制进行传输的是序列化,反之为反序列化;
  • 应用场景一般为读写文件,传输数据/接口调用;

Externalizable和Serializable

java的序列化方式有两种;

Serializable是常用的方法,实现方法为

class User implements Serializable {
private static final long serialVersionUID = -3226152074589523662L;
...
}

实现接口,并且最好有序列化ID;

Externalizable是Serializable的子类,但不会自动化序列化,需要调用方法实现序列化;

idea自动生成序列化ID

打开设置中的检测,然后每次有需要序列化的,生成一个Long型即可

Intellij idea用快捷键自动生成序列化id

序列化ID也可以是自定义的,比如简单的1L,只要调用方和被调用方约定一致即可;

transient关键字

  • transient修饰的变量,不会被序列化;
  • 静态变量一定不会被序列化(类的属性而不是对象的属性值)
  • 一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问;
  • transient关键字只能修饰变量,而不能修饰方法和类;
  • 使用Externalizable可以序列化transient修饰的变量
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.testng.annotations.Test; import java.io.*; @Slf4j
public class TestTransient { // private static final long serialVersionUID = 8204877978271765366L; @Test
public void testTransi(){
User user = new User("andy","123456");
log.info("Before serializable,user={}",user.toString());
try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/user.txt"));
os.writeObject(user);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
try { ObjectInputStream is = new ObjectInputStream(new FileInputStream("D:/user.txt"));
user = (User) is.readObject();
is.close();
log.info("After serializable,username={},pwd={}",user.getUsername(),user.getPassword());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} @Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
static class User implements Serializable {
private static final long serialVersionUID = -3226152074589523662L;
String username;
transient String password;
}
}

还需要注意的几个问题

  • 虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致
  • 要想将父类对象也序列化,就需要让父类也实现Serializable 接口。如果父类不实现的话的,就需要有默认的无参的构造函数
  • 可以尝试使用序列化实现加密控制等(Override),参考RMI技术
  • 注意往一个文件中多次写入同一个对象的情况

Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,上面增加的 5 字节的存储空间就是新增引用和一些控制信息的空间。反序列化时,恢复引用关系,使得清单 3 中的 t1 和 t2 指向唯一的对象,二者相等,输出 true。该存储规则极大的节省了存储空间。

参考文章

【技术累积】【点】【java】【21】序列化二三事的更多相关文章

  1. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  2. (转)如何学习Java技术?谈Java学习之路

    51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...

  3. Java并发编程二三事

    Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...

  4. Atitit. 。Jna技术与 解决 java.lang.Error: Invalid memory access

    Atitit. .Jna技术与 解决 java.lang.Error: Invalid memory access 1. 原因与解决1 2. jNA (这个ms sun 的)1 3. Code1 4. ...

  5. 公共技术点之 Java 反射 Reflection

    本文摘录地址: http://codekk.com/open-source-project-analysis/detail/Android/Mr.Simple/%E5%85%AC%E5%85%B1%E ...

  6. 将Java对象序列化成JSON和XML格式

    1.先定义一个Java对象Person: public class Person { String name; int age; int number; public String getName() ...

  7. 【技术累积】【点】【java】【27】@JSONField

    @JSONField 该注解隶属于阿里fastjson,方便fastjson处理对象时的一些操作 源码 @Retention(RetentionPolicy.RUNTIME) @Target({ El ...

  8. 【技术累积】【线】【java】【2】AOP

    思维导图 基础概念 翻译:面向切面编程,或面向方面编程: 是OOP的重要补充: 切面:传统的OOP构建的是对象之间的关系,是一种垂直的关系:假设,OOP程序是一个圆筒,那么与业务或逻辑无关的东西,比如 ...

  9. 【技术累积】【点】【java】【30】代理模式

    基础 代理模式是Java常见的设计模式之一.所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 什么是代理 参考现实生活中的代理 比如某个品牌的某个省的代理商,作 ...

随机推荐

  1. Ubuntu 16.04下使用gcc输出汇编的.0文件为可执行文件时出现:`_start'被多次定义

    错误如下: `_start'被多次定义 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:(.text+0x0):第一次 ...

  2. PHP array_keys()

    定义和用法 array_keys() 函数返回包含数组中所有键名的一个新数组. 如果提供了第二个参数,则只返回键值为该值的键名. 如果 strict 参数指定为 true,则 PHP 会使用全等比较 ...

  3. Solidworks如何修改单位

    文档属性-单位-修改成mm                                  

  4. Handling PnP Paging Request

    The following explains why the DO_POWER_PAGABLE bit must be set on the way down and not on the way u ...

  5. 用XMLRPC开服务进行server/client通信

    本文讲一下怎样用python的xmlrpc开服务,进行server/client的通信. 应用场景:1)需多client訪问应用程序给予应答情况--网页服务.  2)数据极大,希望载入一次.后面仅仅用 ...

  6. bootstrap-table方法之:expandRow-collapseRow,展开或关闭当前行数据

    官方演示地址:http://issues.wenzhixin.net.cn/bootstrap-table/methods/expandRow-collapseRow.html <!DOCTYP ...

  7. 解决MyEclipse中导入项目@Override错误

    做项目的时候,同事那边电脑上编译通过的java代码,或者是网上下载的例子代码,导入project后却是编译不通过,总是@override报错,把@override去掉就好了,有时候@Override出 ...

  8. 【打CF,学算法——二星级】Codeforces Round #312 (Div. 2) A Lala Land and Apple Trees

    [CF简单介绍] 提交链接:A. Lala Land and Apple Trees 题面: A. Lala Land and Apple Trees time limit per test 1 se ...

  9. UNIX网络编程——网络I/O模型

    在学习UNIX网络编程的时候.一開始分不清 同步 和 异步,所以还是总结一下,理清下他们的差别比較好. IO分类 IO依据对IO的调度方式可分为堵塞IO.非堵塞IO.IO复用.信号驱动IO.异步IO. ...

  10. CentOS yum时出现“Could not retrieve mirrorlist ”的解决的方法——resolv.conf的配置

    原因:没有配置resolv.conf 解决方法: 到/etc文件夹下配置resolv.conf增加nameserver IP,如: nameserver 8.8.8.8 nameserver 8.8. ...