zoukankan      html  css  js  c++  java
  • 对象的序列化

    目的:将一个具体的对象进行持久化,写入到硬盘上。

    注意:静态数据不能被序列化,因为静态数据不在堆内存中,是存储在静态方法区中。

    如何将非静态的数据不进行序列化?transient 关键字修饰此变量即可。

    Serializable用于启动对象的序列化功能,可以强制让指定类具备序列化功能,该接口中没有成员,这是一个标记接口。这个标记接口用于给序列化类提供UID。这个uid是依据类中的成员的数字签名进行运行获取的。如果不需要自动获取一个uid,可以在类中,手动指定一个名称为serialVersionUID id号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的类都进行手动显示的UID的指定。

    import java.io.*;

    class ObjectStreamDemo {

        public static void main(String[] args) throws Exception{

           writeObj();

           readObj();

        }

        public static void readObj()throws Exception{

           ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));

           Object obj = ois.readObject();//读取一个对象。

           System.out.println(obj.toString());

        }

        public static void writeObj()throws IOException{

           ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));

           oos.writeObject(new Person("lisi",25)); //写入一个对象。

           oos.close();

        }

    }

    class Person implements Serializable{

        private static final long serialVersionUID = 42L;

        private transient String name;//transient修饰后name将不会进行序列化

        public int age;

        Person(String name,int age){

           this.name = name;

           this.age = age;

        }

        public String toString(){

           return name+"::"+age;

        }

    }

    -----------------------------------------------------------------------------------------------

    DataOutputStreamDataInputStream专门用于操作基本数据类型数据的对象。

    DataOutputStream dos =  new DataOutputStream(new FileOutputStream("data.txt"));

        dos.writeInt(256);

        dos.close();

        DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));

        int num = dis.readInt();

        System.out.println(num);

        dis.close();

    -----------------------------------------------------------------------------------------------

    ByteArrayInputStream:源:内存

    ByteArrayOutputStream:目的:内存。

    这两个流对象不涉及底层资源调用,操作的都是内存中数组,所以不需要关闭。

    直接操作字节数组就可以了,为什么还要把数组封装到流对象中呢?因为数组本身没有方法,只有一个length属性。为了便于数组的操作,将数组进行封装,对外提供方法操作数组中的元素。

    对于数组元素操作无非两种操作:设置(写)和获取(读),而这两操作正好对应流的读写操作。这两个对象就是使用了流的读写思想来操作数组。

    //创建源:

        ByteArrayInputStream bis = new ByteArrayInputStream("abcdef".getBytes());

        //创建目的:

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        int ch = 0;

        while((ch=bis.read())!=-1){

           bos.write(ch);

        }

        System.out.println(bos.toString());

  • 相关阅读:
    广播接收者的生命周期?
    如何让自己的广播只让指定的 app 接收?
    在 manifest 和代码中如何注册和使用 BroadcastReceiver?
    请描述一下 BroadcastReceiver?
    说说 Activity、Intent、Service 是什么关系
    什么是IntentService?有何优点?
    Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的 Service?
    Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?
    两个 Activity 之间跳转时必然会执行的是哪几个方法?
    如何保存 Activity 的状态?
  • 原文地址:https://www.cnblogs.com/wqing7/p/5896102.html
Copyright © 2011-2022 走看看