您的位置:首页 > 编程语言 > Java开发

java对象序列化

2017-03-06 17:02 211 查看

java对象序列化

1 概述

1.1 概念

对象序列化机制(Object Serialzation)是Java语言内建的一种轻量级持久化方式,可以容易的在JVM的活动对象信息与字节序列之间转化(序列化与反序列化),用来屏蔽底层实现细节。

1.2 意义

对于对象来说,其内部状态信息保存在内存中。当JVM停止运行后,状态信息就消失了。所以我们需要把对象的状态信息保存起来,这就是持久化。

持久化一般来说都是把对象状态信息存放到数据库中。关系型数据库使用对象关系映射(ORM)的方法存放对象状态,例如Hibernate。也就直接把对象状态信息存放到数据库中,如Key-Value型数据库。

Java对象序列化简单的保存对象状态信息,一般用于短期保存和RMI(远程方法调用)。

2 实现

2.1 基本对象序列化

Java实现对象序列化只要实现Serializable接口即可。实现该接口表示该对象可以被序列化,实际的序列化由ObjectInputStream、ObjectOutputStream实现。

ObjectOutputStream的writeObject()方法把对象写入字节序列中,ObejctInputStream的ReadObject()方法从字节序列中读出对象。

在读取与写入过程的时候,参数或者返回值是单个对象,但实际上操控的是对象图,其包括字段以及其依赖的对象。Java会自动帮你遍历对象图并逐个序列化。

对于Serializable对象,其是以二进制位为基础构造的,而不是以构造器进行构造的。

1 public class StudySerializable{
2     public static void main(String[] args)
3             throws IOException, ClassNotFoundException{
4         User user = new User("kanyuxia@outlook.com ", "123456");
5
6         System.out.println("serialize");
7         System.out.println(user);
8         ObjectOutputStream out = new ObjectOutputStream(
9                 new FileOutputStream("E:\\java\\user.dat"));
10         out.writeObject(user);
11
12         System.out.println("deserialize");
13         ObjectInputStream in = new ObjectInputStream(
14                 new FileInputStream("E:\\java\\user.dat"));
15         User user1 = (User) in.readObject();
16         System.out.println(user1);
17     }
18 }
19 class User implements Serializable {
20     private static final long serialVersionUID = 4936874859415237692L;
21     private String userName;
22     private transient String password;
23
24     private void writeObject(ObjectOutputStream outputStream)
25             throws IOException, ClassNotFoundException {
26         outputStream.defaultWriteObject();
27         outputStream.writeObject(password);
28     }
29
30     private void readObject(ObjectInputStream inputStream)
31             throws IOException, ClassNotFoundException {
32         inputStream.defaultReadObject();
33         password = (String) inputStream.readObject();
34     }
35
36     User(String userName, String password){
37         this.userName = userName;
38         this.password = password;
39     }
40
41     @Override
42     public String toString() {
43         return "userName: " + userName + " password: " + password;
44     }
45 }output:
46 serialize
47 userName: kanyuxia@outlook.com  password: 123456
48 deserialize
49 userName: kanyuxia@outlook.com  password: 123456


View Code

2.5 序列化安全性以及RMI

Java对象序列化之后的内容格式是公开的。所以可以很容易的从中提取出各种信息。所以我们可以通过自定义序列化进行该对象一些字段的加密、解密。

RMI(Remote Method Invocation)是Java中的远程过程调用(Remote Procedure Call,RPC)实现,是一种分布式Java应用的实现方式。

上诉方式我都没有实现,先写在这里,以后用到了再来写。

2.6 序列化与反序列化

序列化与反序列化是我们经常遇到的,上面说的序列化与反序列化都是Java自带的序列化机制,其不算高效、通用。我们在使用Key-Value型数据库时,例如Redis时可能需要其它一些高效的序列化框架。

自己在慕课网上学习Seckill时,老师讲到过一点,当时都不懂什么意思,仅仅跟着用了,现在理解了许多。

这里有篇美团技术文章,可以去看看相关的知识。

3 Reference

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: