基础概念

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

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. 人人都是 DBA

    http://www.cnblogs.com/gaochundong/tag/DBA/

  2. 使用 IAsyncResult 调用异步方法

    .NET Framework 和第三方类库中的类型可以提供允许应用程序在主应用程序线程之外的线程中执行异步操作的同时继续执行的方法.下面几部分介绍了在调用使用 IAsyncResult 设计模式的异步 ...

  3. jquery simple modal

    窗体API定义丰富,而且使用也很容易上手.官方地址:http://www.ericmmartin.com/projects/simplemodal/从官方下载插件,在文件中引用<script t ...

  4. Waiting For Debugger

    在eclipse中进行调试时常常出现以下这种提示:Application  (app名称)  is waiting for the debugger to attach 正常情况下.会非常快进入应用调 ...

  5. vmware9.0 install ubuntu

    1)安装vmware 9.0  + 注册码2)因为是.bundle文件,执行下列命令:sudo chmod +x VMware-Workstation-7.1.1-282343.i386.bundle ...

  6. iOS----四方块 动画button实现

    突然想起来上一次面试考官提问的一个问题:怎样创建一个菱形,并让它对应单击事件.能够开合的效果. 当时第一反应使用button来填充菱形的图片来实现,只是考官说,这样点击的区域不够灵敏,毕竟button ...

  7. 百度MP3+图片+文字:生成结果文件;(声音58秒,视频59秒,同步性需要进一步优化)

    import os os_sep = os.sep this_file_abspath = os.path.abspath(__file__) this_file_dirname, this_file ...

  8. java 定位工具

    #查看JVM所有进程及启动类信息以及PID jps -mlvV #查看JVM运行各种状态信息,包括GC,类加载,堆内存信息,jit编译信息等jstat -gcutil <PID> (堆内存 ...

  9. ios2--UIView的常见属性

    // // ViewController.m // 06-UIView的常见属性 // #import "ViewController.h" @interface ViewCont ...

  10. Versioning with the Override and New Keywords (C# Programming Guide)

    The C# language is designed so that versioning between base and derived classes in different librari ...