android序列化
‘壹’ Android是怎么对对数据源中list<String>字段进行Parcelable序列化的
ArrayList<String> photos;
写入
dest.writeStringList(photos);
读取
this.photos=new ArrayList<>();
in.readStringList(this.photos);
注意加粗地方,另一个人回答错了!
‘贰’ android list可以序列化吗
public static void main(String[] args) throws IOException{ List list=new ArrayList(); Date now=new Date(); list.add(now); list.add(new Date(now.getTime()+8888888)); ByteArrayOutputStream byteStream=new ByteArrayOutputStream();
‘叁’ 怎么序列化android.graphics.Path
继承 android.graphics.Path 类,重写 moveTo, lineTo 等方法,记录下 path 绘制的每一点的左边数据;反序列化的时候调用 “drawThisPath” 重绘 path。
相关代码:
public class CustomPath extends Path implements Serializable {
private static final long serialVersionUID = -5974912367682897467L;
private ArrayList<PathAction> actions = new ArrayList<CustomPath.PathAction>();
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
in.defaultReadObject();
drawThisPath();
}
@Override
public void moveTo(float x, float y) {
actions.add(new ActionMove(x, y));
super.moveTo(x, y);
}
‘肆’ 如何用Android studio快速实现对象的序列化接口
方法/步骤
1、在线安装
从Android studio的菜单栏里选择“Preferences”,然后点击“Plugins”选择底部的“Browser repositories”然后再搜索框中输入parcelable,按回车之后选择搜索结果的第一个,android parcelable code generator点击右边的“install plugin”按钮进行安装即可。
2、由于网络原因有些用户可能无法使用在线安装,这里提供离线安装步骤
打开网络直接搜索“plugins jetbrains”第一个就是。打开官网,在搜索栏里搜索关键字:parcelable,点击“go”进行搜索。
3、看到搜索结果,点击第二个,android parcelable code generator
4、看到最新版本为0.6.2,点击“Download”,下载plugin的jar文件。
5、从Android studio的菜单栏里选择“Preferences”,然后点击“Plugins”,从底部选择“install plugin from disk...”找到下载的文件android-parcelable-intellij-plugin.jar选择“choose”即可
7、在entity包下新建一个测试的实体类:Person.java 添加三个私有变量lastName,firstName,age;并设置添加其get set方法。
8、在Person.java 文件中,空白地方鼠标右击,选择“Generat...”然后选择“parcelable”之后选择需要序列化的字段,点击“OK”
‘伍’ java android 实现parcelable序列化,为什么必须要实现CREATOR
你好:
Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在IPC中。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。下面就介绍一下实现Parcelable接口的方法
通过实现Parcelable接口序列化对象的步骤:
1、声明实现接口Parcelable
2、实现Parcelable的方法writeToParcel,将你的对象序列化为一个Parcel对象
3、实例化静态内部对象CREATOR实现接口Parcelable.Creator:
Java代码
public static final Parcelable.Creator<T> CREATOR
其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。
4、完成CREATOR的代码,实现方法createFromParcel,将Parcel对象反序列化为你的对象
简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。
Parcel对象可以通过以下方法写入或读取byte, double, float, int, long, String这6种类型变量。
‘陆’ Android两种序列化的区别和作用
对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。
‘柒’ android内部类怎么序列化
非静态内部类的实例,会隐含保存一个指向其外部类实例的引用。如果进行序列化,估计会有问题。
如果有可能的话,对于需要序列化的实例,最好不要使用非静态的内部类
‘捌’ android 序列化怎么使用
Android 中实现序列化有两个选择:
一是实现Serializable接口(是JavaSE本身就支持的),
一是实现Parcelable接口(是Android特 有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。
实现Serializable接 口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
选择序列化方法的原则
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable
‘玖’ Android Parcelable和Serializable的区别
本文主要介绍Parcelable和Serializable的作用、效率、区别及选择,关于Serializable的介绍见Java 序列化的高级认识。
1、作用
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
从上面的设计上我们就可以看出优劣了。
2、效率及选择
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化
3、编程实现
对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。
Parcelable的一个实现例子如下
[java] view plain print?
public class MyParcelable implements Parcelable {
private int mData;
private String mStr;
public int describeContents() {
return 0;
}
// 写数据进行保存
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeString(mStr);
}
// 用来创建自定义的Parcelable的对象
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();
mStr = in.readString();
}
}
public class MyParcelable implements Parcelable {
private int mData;
private String mStr;
public int describeContents() {
return 0;
}
// 写数据进行保存
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeString(mStr);
}
// 用来创建自定义的Parcelable的对象
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();
mStr = in.readString();
}
}
从上面我们可以看出Parcel的写入和读出顺序是一致的。如果元素是list读出时需要先new一个ArrayList传入,否则会报空指针异常。如下:
list = new ArrayList<String>();
in.readStringList(list);
PS: 在自己使用时,read数据时误将前面int数据当作long读出,结果后面的顺序错乱,报如下异常,当类字段较多时务必保持写入和读取的类型及顺序一致。
11-21 20:14:10.317: E/AndroidRuntime(21114): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@4126ed60: Unmarshalling unknown type code 3014773 at offset 164
4、高级功能上
Serializable序列化不保存静态变量,可以使用Transient关键字对部分字段不进行序列化,也可以覆盖writeObject、readObject方法以实现序列化过程自定义
‘拾’ android 序列化传递对象是同一个对象吗
putSerializable,是通过对象的序列化和反序列化来实现Activity之间对象的传递的,所以这种方法得到的就是两个完全不一样的对象(Activity2中的对象obj就相当于new了一个新对象,然后将Activity1中的对象obj的值都赋给了它,所以可以说它们的内容是一样的,但是对象不一样.). 注:通过上述方法传递的对象obj一定要实现Serializable接口才可以哦! 一般在Activity之间是不做对象的传递的吧,序列化和反序列化本身就没有一定的弊端吧(个人感觉),呵呵...而且对象都要实现Serializable接口. 如果一定要传对象的话可以在做一些静态的类或对象! 希望对你有帮助 ^_^!