是什么
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2)在网络上传送对象的字节序列。
为什么
一般来说如果你的对象需要网络传输或者持久化 (对象直接转换为字节的形式传输),那么就需要实现
Serializable
接口。比如远程方法调
RPC
(Remote Procedure Call) 则接口参数就一定要实现
Serializable
接口;如果只是转换为
json
字符串的形式与网络打交道,那么就不需要实现Serializable接口。
持久化数据库,rpc调用外部接口,网络通信时候。
这几种情况需要实现serialliable接口,转换JSON不需要实现接口
如何做
流操作
/**
* 序列化操作
*/
public static void serialize() {
String targetFile = PATH_PREFIX.concat("user.txt");
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File(targetFile)))) {
UserDomain userDomain = UserDomain.builder().userName("小明").address("123@163.com").build();
objectOutputStream.writeObject(userDomain);
} catch (IOException e) {
log.error("e : 【{}】", e);
throw new RuntimeException(e);
}
log.info("【序列化结束,生成文件user.txt】");
}
/**
* 反序列化
*
* @return
*/
public static UserDomain deserialize() {
String targetFile = PATH_PREFIX.concat("user.txt");
UserDomain user = null;
try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(new File(targetFile)))) {
user = (UserDomain) inputStream.readObject();
} catch (IOException | ClassNotFoundException e) {
log.error("e : 【{}】", e);
throw new RuntimeException(e);
}
log.info("【反序列化结束】");
return user;
}
/**
* 序列化操作
*/
@Test
public void testSerialization(){
FileUtil.serialize();
UserDomain user = FileUtil.deserialize();
log.info("user : [{}]" , user);
}
16:10:08.019 [main] INFO com.geekmice.springbootselfexercise.NoDaoTest – user : [UserDomain(id=null, userName=小明, birthday=null, sex=null, address=123@163.com)]
注事事项
版权声明:本文为greek7777原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。