java序列化与反序列化

 1 package com.sun.demo;
 2 
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 import java.io.Serializable;
 8 import java.sql.Blob;
 9 
10 import org.hibernate.Hibernate;
11 
12 public class SerializableDemo implements Serializable {
13 
14     private static final long serialVersionUID = 1L;
15 
16     private Blob statistic;
17 
18     /**
19      * 把对象转换为blob类型,以便保存到数据库
20      * 
21      * @param obj
22      * @return
23      */
24     public java.sql.Blob Object2Blob(Object obj) {
25         try {
26             ByteArrayOutputStream out = new ByteArrayOutputStream();
27             ObjectOutputStream outputStream = new ObjectOutputStream(out);
28             outputStream.writeObject(obj);
29             byte[] bytes = out.toByteArray();
30             outputStream.close();
31             return Hibernate.createBlob(bytes);
32         } catch (Exception e) {
33             e.printStackTrace();
34         }
35         return null;
36     }
37 
38     /**
39      * 将blob转换为对象
40      * 
41      * @param decBlob
42      * @return
43      */
44     public Object blob2Object(java.sql.Blob decBlob) {
45         try {
46             ObjectInputStream in = new ObjectInputStream(decBlob.getBinaryStream());
47             Object obj = in.readObject();
48             in.close();
49             return obj;
50         } catch (IOException e) {
51             e.printStackTrace();
52         } catch (Exception e) {
53             e.printStackTrace();
54         }
55         return null;
56     }
57 
58     public Blob getStatistic() {
59         return statistic;
60     }
61 
62     public void setStatistic(Blob statistic) {
63         this.statistic = statistic;
64     }
65 
66 }

这里几个注意点

一、

在Eclipse中,提供两种方式让我们快速添加SerialVersionUid。

add default serial version ID:

add generated serial version ID:

对于第一种,需要了解哪些情况是可兼容的,哪些根本就不兼容。

第二种方式,是根据类的结构产生的hash值。增减一个属性、方法等,都可能导致这个值产生变化。

在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功

二、

虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。两个类的功能代码完全一致,但是序列化 ID 不同,他们无法相互序列化和反序列化。当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。

三、

序列化时,并不保存静态变量,这其实比较容易理解,序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。

四、

Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

原文地址:https://www.cnblogs.com/sun-space/p/5604707.html