zoukankan      html  css  js  c++  java
  • [java基础] serialVersionUID

    serialVersionUID的作用

    个人理解:java序列化就是指把对象转化成字节序列,反序列化是指从字节序列中恢复java对象。

    用eclipse写一个类实现serializable接口时,有两种选择,一是使用默认的序列号1L,另一个是自动生成。

    这里“自动生成”是:根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。类A放在包1里和放在包2里生成的serialVersionUID是不同的。

    public static InputStream objectToStream(java.lang.Object obj) throws Exception 
    {     
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
        ByteArrayInputStream byteIn=null;
        try 
        {   
    	ObjectOutputStream oo = new ObjectOutputStream(byteOut);  
    	oo.writeObject(obj);
    	oo.flush();
    	byteIn = new ByteArrayInputStream(byteOut.toByteArray());
    	byteOut.close();   
            oo.close(); 
    	
        } 
        catch (Exception e) 
        {  
    	throw e;  
    			
        }  
        return byteIn; 
    }
    
    
    public static java.lang.Object streamToObject(InputStream input) throws Exception 
    {  
        java.lang.Object obj=new java.lang.Object(); 
        try 
        {     
            ObjectInputStream oi = new ObjectInputStream(input);   
    	obj = oi.readObject(); 
    	oi.close(); 
        } 
        catch (Exception e) 
        {  
    	throw e;
        }
        return obj;
    } 
    

    上面两个方法分别实现了序列化和反序列化。

    注意:

    1. 序列化和反序列化必须用相同的serialVersionUID
    2. 序列化时,对象的包信息也写在了字节序列里,所以反序列化时,对象的包路径要保持一致。比如原来将com.helloc001.test1序列化了,那反序列化时必须也存在com.helloc001.test1.

    所以我觉得用默认的1L比较方便,用自动生成的serialVersionUID比较安全。

  • 相关阅读:
    【Spring】 AOP Base
    【Offer】[20] 【表示数值的字符串】
    【Offer】[19] 【字符串匹配】
    【设计模式】代理模式
    【LeetCode】[0002] 【两数之和】
    【Offer】[18-1] 【在O(1)时间内删除链表节点】
    【Offer】[18-2] 【删除链表中重复的节点】
    【Offer】[17] 【打印1到最大的n位数】
    【Offer】[16] 【数值的整数次方】
    python_内置函数
  • 原文地址:https://www.cnblogs.com/simple-code/p/5121837.html
Copyright © 2011-2022 走看看