序列化与反序列化
来源:互联网 发布:java开发百度云播放器 编辑:程序博客网 时间:2024/06/16 08:49
概念
序列化与反序列化
- Java序列化就是将Java对象转换成字节序列的过程
- Java反序列化就是将字节序列恢复为Java对象的过程
用途
- 数据的持久化,通过将数据对象序列化可以让数据对象脱离内存,可以写入物理磁盘或者数据库从而将数据持久的保存
- 远程数据传输,比如文件、图片、音频、视频等都是通过二进制序列的方式进行交换数据的。通过序列化,将Java对象转换为字节序列,就可以实现数据的远程通信。
JDK序列化与反序列化
只有实现了Serializable或者Externalizable接口的类的对象才能被序列化。Externalizable继承自Serializable接口,区别在于实现Externalizable可控制序列化的行为,而实现Serializable接口的类则采用默认的序列化方式
对象序列化步骤
- 创建一个对象输出流,包装一个其他类型的输出流
- 调用对象输出流的writeObject()方法写对象
对象反序列化步骤
- 创建一个对象输入流,包装一个其他类型的输入流
- 调用对象输入流的readObject()方法获取对象
提供两个序列化与反序列化示例
此处示例均略去Person类代码
示例一(将对象放入文件)
public class TestObjSerializeAndDeserialize { public static void main(String[] args) throws Exception { SerializePerson();//序列化Person对象 Person p = DeserializePerson();//反序列Perons对象 System.out.println(MessageFormat.format("name={0},age={1},sex={2}", p.getName(), p.getAge(), p.getSex())); } /** * MethodName: SerializePerson * Description: 序列化Person对象 * @author xudp * @throws FileNotFoundException * @throws IOException */ private static void SerializePerson() throws FileNotFoundException, IOException { Person person = new Person(); person.setName("gacl"); person.setAge(25); person.setSex("男"); // ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream( new File("E:/Person.txt"))); oo.writeObject(person); System.out.println("Person对象序列化成功!"); oo.close(); } /** * MethodName: DeserializePerson * Description: 反序列Perons对象 * @author xudp * @return * @throws Exception * @throws IOException */ private static Person DeserializePerson() throws Exception, IOException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream( new File("E:/Person.txt"))); Person person = (Person) ois.readObject(); System.out.println("Person对象反序列化成功!"); return person; }}
示例二(将对象放入Redis缓存)
/** * 序列化 */public static byte[] serialize(Object obj){ ObjectOutputStream oos = null; ByteArrayOutputStream bos = null; bos = new ByteArrayOutputStream(); try { oos = new ObjectOutputStream(bos);//包装byte数组到输出流 oos.writeObject(obj); byte[] bytes = bos.toByteArray(); oos.flush(); oos.close(); bos.close(); return bytes; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 反序列化 */ public static Object unserialize(byte[] bytes){ ObjectInputStream ois = null; ByteArrayInputStream bis = null; bis = new ByteArrayInputStream(bytes); try { ois = new ObjectInputStream(bis);//将字节数组包装进输入流 ois.close(); bis.close(); return ois.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 放入对象 */ @Test public void setObject(){ Person p = new Person(100,"lucy"); Jedis jedis = new Jedis("localhost"); jedis.set("person:100".getBytes(), SerializableUtil.serialize(p)); p = new Person(101,"rose"); jedis.set("person:101".getBytes(), SerializableUtil.serialize(p)); } /** * 取出对象 */ public Person getObject(int id){ Jedis jedis = new Jedis("localhost"); byte[] person = jedis.get(("person:"+id).getBytes()); return (Person)SerializableUtil.unserialize(person); } public static void main(String[] args){ SerializableUtil su = new SerializableUtil(); Person p = su.getObject(100); System.out.println(p.toString()); }}
阅读全文
0 0
- 序列化与反序列
- 序列化与反序列
- XML序列化与反序列化
- 对象序列化与反序列化
- 序列化与反序列化
- 转载:序列化与反序列化
- c#序列化与反序列化
- java序列化与反序列化
- XML序列化与反序列化
- 序列化与反序列化
- 序列化与反序列化
- C#序列化与反序列化
- java序列化与反序列化
- XML序列化与反序列化
- 再看序列化与反序列化
- 序列化与反序列化对象
- 序列化与反序列化
- .NET序列化与反序列化
- 哈夫曼树
- 输出一个矩形(长方形)
- 字节流的操作(3+1)
- JDK提供复制文件三种方式
- 技术人生(20) ——ORA-01555错误启示录
- 序列化与反序列化
- Pointers on C——6 Pointers.15
- Pointers on C——7 Functions.1
- SQL Challenge 每日一题:2017-8-1 自定义嵌套表类型的MULTISET
- P2P网络概念的背景和基础认识
- Pointers on C——7 Functions.2
- Pointers on C——7 Functions.3
- Pointers on C——7 Functions.4
- Pointers on C——7 Functions.5