• 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。

  • 相关阅读:
    Vuejs
    Vuejs
    Vuejs
    Vuejs
    JS高级之面试必须知道的几个点
    用vue快速开发app的脚手架工具
    作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars
    REST接口设计规范总结
    eclipse实现JavaWeb应用增量打包
    转载:作为面试官,我是怎么快速判断程序员能力的?
  • 原文地址:https://www.cnblogs.com/sun-space/p/5604707.html
Copyright © 2020-2023  润新知