zoukankan      html  css  js  c++  java
  • Java 序列化

    1、Java的对象序列化是指将那些实现了Serializable接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。 只要对象实现了Serializable接口(记住,这个接口只是一个标记接口,不包含任何的方法

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

    2、serialVersionUID(“串行化版本统一标识符”(serial version universal identifier)) 的作用:在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性的时候,那么在某一个对象已经被串行化了,可是这个对象又被修改后重新部署了,那么在这种情况下, 用老软件来读取新文件格式虽然不是什么难事,但是有可能丢失一些信息。 serialVersionUID来解决这些问题,新增的serialVersionUID必须定义成下面这种形式:static final long serialVersionUID=-2805284943658356093L;。其中数字后面加上的L表示这是一个long值。 通过这种方式来解决不同的版本之间的串行话问题。

    3、示例:

    package test.serializable;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    
    public class Myworld {
    
        /**
         * @param args
         * @throws IOException 
         * @throws ClassNotFoundException 
         */
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            House house = new House();
            System.out.println("序列化前");
            Animal animal = new Animal("test",house);
            System.out.println(animal);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(out);
            oos.writeObject(animal);
            oos.writeObject(animal);//在写一次,看对象是否是一样,
            oos.flush();
            oos.close();
            
            ByteArrayOutputStream out2 = new ByteArrayOutputStream();//换一个输出流
            ObjectOutputStream oos2 = new ObjectOutputStream(out2);
            oos2.writeObject(animal);
            oos2.flush();
            oos2.close();
    
            System.out.println("反序列化后");
            ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(in);
            Animal animal1 = (Animal)ois.readObject();
            Animal animal2 = (Animal)ois.readObject();
            ois.close();
            
            ByteArrayInputStream in2 = new ByteArrayInputStream(out2.toByteArray());
            ObjectInputStream ois2 = new ObjectInputStream(in2);
            Animal animal3 = (Animal)ois2.readObject();
            ois2.close();
            
            System.out.println("out流:" +animal1);
            System.out.println("out流:" +animal2);
            System.out.println("out2流:" +animal3);
            
            
            System.out.println("测试序列化前后的对象 == :"+ (animal==animal1));
            System.out.println("测试序列化后同一流的对象:"+ (animal1 == animal2));
            System.out.println("测试序列化后不同流的对象==:" + (animal1==animal3));
            
        }
    
    }
    工作小总结,有错请指出,谢谢。
  • 相关阅读:
    我的日常笔记
    html元素是如何占据空间和定位的
    jdbc和数据库的应用
    java笔记之String的应用
    java笔记之静态修饰附和单例设计模式
    java笔记
    本人对于JavaScript的一些总结
    JavaScript 轮播图
    h5简单布局练习
    有一个八位数,个位数+十位数+百位数+千位数一直加到千万位数的和除以7能等于0.。。。
  • 原文地址:https://www.cnblogs.com/zilanghuo/p/6677430.html
Copyright © 2011-2022 走看看