zoukankan      html  css  js  c++  java
  • 每天进步一点点-实例为导学-一个java对象序列化的例子

    序列化和反序列化例子

    如果我们想要序列化一个对象,

    对象序列)首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream记住:对象的序列化是基于字节(1字节8位)的,不能使用Reader和Writer等基于字符的层次结构。而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。

    写完就睡了,首先: 将FileOutputStream 封装在一个ObjectOutPutStream中

    ObjectOutputStream能把Object输出成Byte流  
    接着直接调用writeObject()方法就可以序列化了


    将 序列 转成 对象 也是这2步骤

    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.FileOutputStream;  
    import java.io.IOException;  
    import java.io.ObjectInputStream;  
    import java.io.ObjectOutputStream;  
    import java.io.Serializable;  
      
    public class MyTest implements Serializable  {  
        private static final long serialVersionUID = 1L;  
        private String name="SheepMu";  
        private int age=24;  
        public static void main(String[] args)   {//以下代码实现序列化  
            try{  
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("my.out"));//输出流保存的文件名为 my.out ;ObjectOutputStream能把Object输出成Byte流  
                MyTest myTest=new MyTest();  
                oos.writeObject(myTest);   //变换
                oos.flush();  //缓冲流  , 马士兵说将内存中的数据全部flush到硬盘文件中 
                oos.close(); //关闭流  
            } catch (FileNotFoundException e){          
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }   
            fan();//调用下面的  反序列化  代码  
        }  
        public static void fan()//反序列的过程  
        {      
            ObjectInputStream oin = null;//局部变量必须要初始化  
            try {  
                oin = new ObjectInputStream(new FileInputStream("my.out"));  
            } catch (FileNotFoundException e1){          
                e1.printStackTrace();  
            } catch (IOException e1){  
                e1.printStackTrace();  
            }        
            MyTest mts = null;  
            try {  
                mts = (MyTest ) oin.readObject();//由Object对象向下转型为MyTest对象  
            } catch (ClassNotFoundException e) { //向上转型(即是自动进行的) ArrayList的引用变量向List的引用变量; 任何类向Object转型
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }       
             System.out.println("name="+mts.name);      
             System.out.println("age="+mts.age);      
        }  
    }
    /**
     * 会在此项目的工作空间生成一个 my.out文件。序列化后的内容稍后补齐,先看反序列化后输出如下:
        name=SheepMu
        age=24
     */

    序列化ID

    序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。这也可能是造成序列化和反序列化失败的原因,因为不同的序列化id之间不能进行序列化和反序列化。


    序列化前和序列化后的对象的关系

    是 "=="还是equal? or  是浅复制还是深复制? 

    答案:深复制,反序列化还原后的对象地址与原来的的地址不同

    序列化前后对象的地址不同了,但是内容是一样的,而且对象中包含的引用也相同。换句话说,通过序列化操作,我们可以实现对任何可Serializable对象的”深度复制(deep copy)"——这意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。对于同一流的对象,他们的地址是相同,说明他们是同一个对象,但是与其他流的对象地址却不相同。也就说,只要将对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,而且只要在同一流中,对象都是同一个。


    序列化会忽略静态变量,即序列化不保存静态变量的状态。静态成员属于类级别的,所以不能序列化。即 序列化的是对象的状态不是类的状态

    a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

    b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

    c) static,transient后的变量不能被序列化;


  • 相关阅读:
    __autoload函数
    错误处理try catch
    PHP面向对象基础实例
    类的继承关系实例
    YII重点文件
    //计算今年月度利息和
    cookie保存分页参数
    win64(win8)的python拓展包安装经验总结
    matcom安装时无法寻找到matlab.exe的解决办法
    《人人都是产品经理》阅读笔记一
  • 原文地址:https://www.cnblogs.com/cs-lcy/p/7352202.html
Copyright © 2011-2022 走看看