zoukankan      html  css  js  c++  java
  • 第二章——Serializable的使用(跨进程使用和Intent的传递对象)

    一、Serializable类(JAVA本身具有的)

    简介:Serializable是一个接口。

    作用:是JAVA提供的序列化接口,实现序列化和反序列化的操作。

    二、跨进程使用

    1.事前准备

    public class Book implements Serializable {
    
        //注:此段可写也可不写 —— 稍后讲解 ①
        private static final long serialVersionUID = 13165131351L;
    
        private String mBookName;
        private int mBookId;
    /**
    *准备:创建Book类,并继承Seriaizable接口
    * */
    
        public Book(int bookId, String bookName) {
            mBookId = bookId;
            mBookName = bookName;
        }
    
        @Override
        public String toString() {
            return mBookId+""+mBookName;
        }
    }
    View Code

    2.序列化与反序列化

    //序列化过程
    Book book = new Book(123,"Android 开发艺术探索");
    FileOuputStream fos = new FileOutputStream("test.txt");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(book);
    oss.close();
    
    
    
    //反序列化过程
    FileInputStream fis = new FileInputStream("test.txt");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Book newBook = (Book)ois.readObject();
    ois.close();

    注:反序列化之后对象book与newBook数据相同,但两者不是同一个对象。

    3.原理

    当序列化的时候,系统会把当前类的serialVersionUID写入序列化的文件中,当反序列化的时候系统回去检测文件中的serivalVersionUID是否与当前类的serivalVersionUID相同,如果不相同就会反序列化失败。

    回答①:当我们继承Serializable的时候,系统会自动提供一个serialVersionUID值,但是当该类中有改变(如:成员变量 减少或者增加,我们将类拿去修改)就会改变系统提供的serialVersionUID值。

    但是,如果自己设置了serialVerionUID的值,当成员变量、方法 减少或者增加的时候,因为反序列化的是之前没有改变类的序列化,所以系统会尽可能恢复多的数据。如果改变类名和成员变量的类型,就还是会反序列化失败(结构都变了)。

    注:静态成员、用transient标记的成员变量不进行序列化

    三、Intent之间传递Serializable类(各个Activity传递对象的方法)

    //MainActivity.java
    Book book = new Book(123, "android开发艺术探索");
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    intent.putExtra("book",book);
    startActivity(intent);
    
    //SecondActivity.java
    Intent intent = getIntent();
    Book book = intent.getSerializableExtra("book");

    只需要让对象继承Serializable接口就可以了,之后就用Intent传递。

  • 相关阅读:
    解决首次访问网上邻居密码错误,而造成的以后都无权访问的解决方案。
    MapX开发日记(二)
    对于一个网卡绑定多个IP的问题。
    .net VS 全角问题
    DotnetBar MapX中动态生成可以查询地图数据的弹出菜单问题
    sqlServer 字符型字段默认为空字符串
    MapX开发日记(一)
    ASP.NET Dbtype属性无效 与系统自带控件为英文
    原创 c# 封装的带CheckBox的DataGridViewColumnHeaderCell 源码部分 实现DataGridView列头带CheckBox控件实现全选功能,支持列头带标题
    关于去共享锁获取脏数据
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5341949.html
Copyright © 2011-2022 走看看