Java默认序列化
Java序列化是在JDK1.1中引入的。是Java内核的重要特性之一。如果希望一个类对象是可序列化的,要做的就是实现Serializable 接口。Java的Serializable是一个标记接口,不需要实现任何字段和方法。
如下例的为Serializable接口的源码:
package java.io;
public interface Serializable {
}
这就像是一种选择性加入处理,通过它可以使类对象成为可序列化的对象。序列化处理是由**ObjectInputStream、ObjectOutputStream **实现的,因为我们需要做的是基于它们进行一层封装,要么将其保存为文件,要么将其通过网络发送。
下面是一个简单的序列化实例,User 对象类:
package com.study;
import java.io.Serializable;
/***
* 用户类
*/
public class User implements Serializable {
private static final long serialVersionUID = 6790721269925597540L;
public User(){}
private Long userId;
private String userName;
/*** 此处省略get set方法和更多的类属性 ***/
@Override
public String toString(){
return "User{" +
"userId=" +userId+
", userName='" +userName+
"'}";
}
}
自定义序列化接口
下面我来自定义一个序列化接口ISerializer:
package com.study.inter;
/***
* 自定义的序列化接口
*/
public interface ISerializer {
/** 1.对象序列化 **/
<T> byte[] serialize(T obj);
/** 2.对象反序列化 **/
<T> T deserialize(byte[] data, Class<T> clazz);
/** 3.将对象序列化到文件中 **/
<T> void serializeToFile(T obj, String fileName);
/** 4.从文件中反序列化成对象 **/
<T> T deserializeFromFile(String fileName, Class<T> clazz);
}
自定义实现序列化
编写自定义序列化类 JavaSerializer,实现上面的ISerializer接口,同时实现方法:
package com.study.inter.impl;
import com.study.inter.ISerializer;
import java.io.*;
/***
* 自定义序列化实现
*/
public class JavaSerializer implements ISerializer {
/** 1.对象序列化 **/
@Override
public <T> byte[] serialize(T obj) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try{
ObjectOutputStream outs = new ObjectOutputStream(baos);
outs.writeObject(obj);
outs.close();
}catch (Exception e){
throw new RuntimeException();
}
return baos.toByteArray();
}
/** 2.对象反序列化 **/
@Override
public <T> T deserialize(byte[] data, Class<T> clazz) {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
try{
ObjectInputStream ois = new ObjectInputStream(bais);
return (T) ois.readObject();
}catch (Exception e){
throw new RuntimeException();
}
}
/** 3.将对象序列化到文件中 **/
@Override
public <T> void serializeToFile(T obj, String fileName) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try{
fos = new FileOutputStream(fileName);
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.close();
fos.close();
}catch (Exception e){
throw new RuntimeException();
}
}
/** 4.从文件中反序列化成对象 **/
@Override
public <T> T deserializeFromFile(String fileName, Class<T> clazz) {
FileInputStream fis = null;
ObjectInputStream ois = null;
try{
fis = new FileInputStream(fileName);
ois = new ObjectInputStream(fis);
return (T)ois.readObject();
}catch (Exception e){
throw new RuntimeException();
}
}
}
编写测试程序
编写测试类TestSerialize 类:
package com.study.test;
import com.study.User;
import com.study.inter.impl.JavaSerializer;
import java.util.Arrays;
/***
* 序列化测试程序
*/
public class TestSerialize {
public static void main(String[] args) {
User user=new User();
user.setUserId(1001L);
user.setUserName("懒驴博客");
JavaSerializer javaSerializer=new JavaSerializer();
//1.序列化
byte[] userBytes = javaSerializer.serialize(user);
System.out.println("user对象序列化的结果是:" + Arrays.toString(userBytes));
//2.反序列化
User deserializeUser=javaSerializer.deserialize(userBytes, User.class);
System.out.println("反序列化后的结果是:"+deserializeUser.toString());
//3.序列化到文件
javaSerializer.serializeToFile(user, "D:\\tmp.out");
//4.从文件中反序列化
User serializeFromFileUser = javaSerializer.deserializeFromFile("D:\\tmp.out", User.class);
System.out.println("从文件在序列化的结果为:"+serializeFromFileUser);
}
}
运行结果:
注意:文件中的乱码是没有转码的原因,详细内容后续粘贴出来。