详解java 对象序列化和反序列化:如何实现java序列化
详解java 对象序列化和反序列化:如何实现java序列化implements java.io.Serializablepublic class Person显示一个实现 Serializable 的 Person 类。Serializable Personpackage com.tedneward;
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。
实际上,序列化的思想是 “冻结” 对象状态,传输对象状态(写到磁盘、通过网络传输等等),然后 “解冻” 状态,重新获得可用的 Java 对象。所有这些事情的发生有点像是魔术,这要归功于 ObjectInputStream/ObjectOutputStream 类、完全保真的元数据以及程序员愿意用Serializable 标识接口标记他们的类,从而 “参与” 这个过程。
显示一个实现 Serializable 的 Person 类。
Serializable Person
package com.tedneward;
public class Person
implements java.io.Serializable
{
public Person(String fn String ln int a)
{
this.firstName = fn; this.lastName = ln; this.age = a;
}
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }
public int getAge() { return age; }
public Person getSpouse() { return spouse; }
public void setFirstName(String value) { firstName = value; }
public void setLastName(String value) { lastName = value; }
public void setAge(int value) { age = value; }
public void setSpouse(Person value) { spouse = value; }
public String toString()
{
return "[Person: firstName=" firstName
" lastName=" lastName
" age=" age
" spouse=" spouse.getFirstName()
"]";
}
private String firstName;
private String lastName;
private int age;
private Person spouse;
}
将 Person 序列化后,很容易将对象状态写到磁盘,然后重新读出它。
FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器 由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
package serialize.json;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
import serialize.UserVo;
public class FastJsonTest
{
private UserVo user = null;
@Before
public void init()
{
user = new UserVo();
user.setName("zzh");
user.setAge(18);
UserVo f1 = new UserVo();
f1.setName("jj");
f1.setAge(17);
UserVo f2 = new UserVo();
f2.setName("qq");
f2.setAge(19);
List<UserVo> friends = new ArrayList<UserVo>();
friends.add(f1);
friends.add(f2);
user.setFriends(friends);
}
@Test public void writeJson()
{
String str = JSON.toJSONString(user);
System.out.println(str);
System.out.println(str.length());
}
@Test public void readJson()
{
String serString = "{\"name\":\"zzh\" \"age\":18 \"friends\":[{\"name\":\"jj\" \"age\":17} {\"name\":\"qq\" \"age\":19}]}";
UserVo userVo = JSON.parseObject(serString UserVo.class);
System.out.println(userVo.getName());
}
}
最后,读取对象的顺序与写入时的顺序要一致。
对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。
尚学堂12大精英团队 各类实战项目,真正实现1 1>10的目标效果。帮助学员迅速成长,持久腾飞,成就学员“高富帅”人生;帮助企业技术和团队成长,成就百年中华名企;助力中国持续成为世界强国而贡献力量。尚学堂12大精英团队,覆盖IT行业十大领域,实战团队240人,服务学员累计超过10万人,就业合作企业数量500 。