zoukankan      html  css  js  c++  java
  • android Serializable 和 Parcelable 区别

     

    android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。

    一 序列化原因:

    1.永久性保存对象,保存对象的字节序列到本地文件中;
    2.通过序列化对象在网络中传递对象;
    3.通过序列化在进程间传递对象。 

    二 至于选取哪种可参考下面的原则:

    1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
    2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
    3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。


    实现:
    1 Serializable 的实现,只需要继承  implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。

    2 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

    public class MyParcelable implements Parcelable {
         private int mData;
    
         public int describeContents() {
             return 0;
         }
    
         public void writeToParcel(Parcel out, int flags) {
             out.writeInt(mData);
         }
    
         public static final Parcelable.Creator<MyParcelable> CREATOR
                 = new Parcelable.Creator<MyParcelable>() {
             public MyParcelable createFromParcel(Parcel in) {
                 return new MyParcelable(in);
             }
    
             public MyParcelable[] newArray(int size) {
                 return new MyParcelable[size];
             }
         };
         
         private MyParcelable(Parcel in) {
             mData = in.readInt();
         }
     }

    详细实例:

    public class Book implements Parcelable
    {
        private String bookName;
        private String author;
        private int publishDate;
        
        public Book()
        {
            
        }
        
        public String getBookName()
        {
            return bookName;
        }
        
        public void setBookName(String bookName)
        {
            this.bookName = bookName;
        }
        
        public String getAuthor()
        {
            return author;
        }
        
        public void setAuthor(String author)
        {
            this.author = author;
        }
        
        public int getPublishDate()
        {
            return publishDate;
        }
        
        public void setPublishDate(int publishDate)
        {
            this.publishDate = publishDate;
        }
        
        @Override
        public int describeContents()
        {
            return 0;
        }
        
        @Override
        public void writeToParcel(Parcel out, int flags)
        {
            out.writeString(bookName);
            out.writeString(author);
            out.writeInt(publishDate);
        }
        
        public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>()
        {
            @Override
            public Book[] newArray(int size)
            {
                return new Book[size];
            }
            
            @Override
            public Book createFromParcel(Parcel in)
            {
                return new Book(in);
            }
        };
        
        public Book(Parcel in)
        {
            bookName = in.readString();
            author = in.readString();
            publishDate = in.readInt();
        }
    }
  • 相关阅读:
    c# linq查询的等于大于符号是什么意思?
    c# Socket tcpClient处理连接超时方式timeout
    不同网段服务器与客户端连接问题解决方法TCP/IP_C/S
    Http请求响应及SpringMVC相关注解解析
    Nginx部署项目,转发规则,负载均衡配置
    Linux redis设置后台启动
    Linux centos7安装Jdk nginx redis
    SpringCloud整合SpringSecurity JWT进行认证 ,鉴权
    C#中class与struct的区别概述
    列举ASP.NET 页面之间传递值的几种方式
  • 原文地址:https://www.cnblogs.com/hzm112567/p/3839823.html
Copyright © 2011-2022 走看看