首页 > 其他分享 >Android中序列化方式:Serialzable接口、Parcelabel接口、Binder(一)

Android中序列化方式:Serialzable接口、Parcelabel接口、Binder(一)

时间:2024-11-26 11:59:06浏览次数:8  
标签:Serialzable userId 接口 User new 序列化 public out

Serializable接口

Java提供的一个序列化空接口,为对象提供标准的序列化和反序列化操作,使用方法只需要在类的声明中指定一个标识

public class User implements Serializable {
	private static final long serialVersionUID = 519067123721295773L;
	public int userId;
	public String userName;
	public boolean isMals;
	......
}
序列化过程

实现序列化和反序列化的方式非常简单,只需要使用ObjectOutputString和ObjectInputString即可实现

//序列化
User user = new User (0, "jace", true);
ObjectOutputString out = new ObjectOutputString( new FileOutputString ("cache.txt") );
out.writeObject(user);
out.close();
//反序列化
ObjectInputString in = new ObjectInputString( new FileInputString("catche.txt") );
User newUser = (User) in.readObject();
in.closer();

注意:恢复后的对象newUser和user的内容完全一样,但是两者并不是同一个对象


手动设置serialVersionUID

关于手动设置serialVersionUID,是因为省去的当原类发生变化时(如增加或删除了某些成员变量,系统会重新去计算当前类的hash值并把它赋值给新的serialVersionUID,导致跟之前的不一致,进而出现反序列化失败的场景),但如果类结构发生了非常规性改变(修改类名、修改成员变量的类型)即使此时指定的serialVersionUID,还是会反序列化失败,因为类结构发生了根本性的改变,无法从老版本的数据中还原

serialVersionUID出错
在这里插入图片描述

注意:静态成员变量属于类不属于对象;使用transient关键字修饰的成员变量不参与序列化过程

Parcelable接口

实现Parcelable接口,类对象可以实现序列化并通过Intent和Binder传递

用法
public class User implements Parcelable {
	public int userId;
	public String userName;
	public boolean isMale;
	public Book book;
	public User( int userId, String userName, boolean isMale) {
		this.userId = userId;
		this.userName = userName;
		this.isMale = isMale;
	}
	public int dercribeContents() {
		return 0;
	}
	public void writeToParcel(Parcel out,int flags) {
		out.writeInt(userId);
		out.writeString(userName);
		out.writeInt(isMale ? 1 : 0);
		out.writeParcelable(book,0);
	}
	public static final Parcelable.Creator<User> CREATOR = new Parcelable.
	Creator<User>() {
		public User createFromParcel(Parcel in) {
			return new User(in);
		}
		public User[] newArray(int size) {
			return new User[size];
		}
	};
	private User(Parcel in) {
		userId = in.readInt();
		userName = in.readString();
		isMale = in.readInt() == 1;
		book = in.readParcelable(Thread.currentThread().getContextClassLoader());
	}
}

Parcel内部包装了序列化的数据,可以在Binder中自由传输,序列化由writeToParcel完成,反序列化由CREATOR完成,内容描述由describeCotents方法完成

Parcel常用方法

在这里插入图片描述

系统中提供了很多实现Parcel接口的类,用于直接完成序列化,如Intent、Bundle、Bitmap等,同时List和Map也可以序列化,前提是它里面的每个元素都是可以序列化的

Serializable和Parcel的比较

二者都可以进行序列化并且可用于Intent间数据传递
Serializable是Java中序列化的接口,使用简单,但开销较大,序列化和反序列化的过程中需要大量的I/O操作
Parcelable是Android中的序列化方式,更适合在Android平台上使用,使用起来相对较为繁琐,但效率高。

标签:Serialzable,userId,接口,User,new,序列化,public,out
From: https://blog.csdn.net/qq_53092981/article/details/144053216

相关文章

  • 职业技能竞赛-接口测试技术分享2
    引言        接口测试是测试系统组件间接口的一种测试,主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。     HTTP操作方式GET:获取指定资源的数据POST:向指定的资源提交数据,数据放在请求正文中PUT:提交数据到指定资源取代之前的数据DELETE:申请......
  • socket流程及相关函数接口
    目录​编辑 socket类型socket创建流程函数接口socketconnectsockaddr结构体bindlistenacceptrecv/sendclose socket类型流式套接字(SOCK_STREAM)  TCP提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制......
  • 抽象类和接口
    1、抽象类定义:在面向对象的概述中,所有的对象都是通过类来描述的,但是反过来,并不是所有类都是描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。特点:1、抽象类中可以存在抽象方法,抽象方法被abstract修饰,该方法可以没有具体实现(但反过来,当一......
  • RMI原理及常见反序列化攻击手法
    这是对网上一些文章和视频的再总结,可以参考以下资料,师傅们分析的都挺详细了,我这就是记录一下师傅们写的博客。廖雪峰-给了简单的小例子,了解即可B站视频(白师傅)先知社区(小阳师傅)-讲的比较详细,偏理论,可以结合白师傅的视频学习理论g师傅-攻击手法讲的特别详细,学完理论后......
  • Java成员特点与接口的各种关系 牛顿迭代法计算平方根
    1.(1)importjava.util.Scanner;publicclasstest{publicstaticvoidmain(String[]args){irrl=newirr();l.method();Scannersc=newScanner(System.in);sc.next();}}(2)publicinterfaceinter{//默认在int前加......
  • 接口_演练
    参考:接口-java教程-廖雪峰的官方网站接口引入publicabstractclassPerson{privateStringname;//String是基本类型吗?如果不是,那是什么类型privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;......
  • 接口练习_动物王国
    问题描述请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口AnimalInfo,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口AnimalInfo里的方法输出一条有语句“鸟儿飞翔”,重写父类的eat()方法输出一条语句“鸟儿吃虫”。创建T......
  • 第4天:基础入门-Web应用&蜜罐系统&堡垒机运维&API内外接口&第三方拓展结构&部署影响
    #知识点:1、基础入门-Web应用-蜜罐系统2、基础入门-Web应用-堡垒机运维3、基础入门-Web应用-内外API接口4、基础入门-Web应用-第三方拓展架构一、蜜罐:https://hfish.net/测试系统:Ubuntu20.04一键安装:bash<(curl-sS-Lhttps://hfish.net/webinstall.sh)1、有......
  • 【Azure 环境】从Azure AD(Entra ID)中获取的Token在访问自定义的接口应用时验证不通
    问题描述集成AzureAD(新名称MicrosoftEntraID),拿到对应的accessToken作为登录用的凭证。这个 AccessToken 能够正常返回,并作为Microsoft Graph userinfoAPI的Authorization,因为应用中会对前端传递过来的 AccessToken进行校验合法性。但目前遇见的问题时这个 Token 签......
  • 用python、JAVA等多种语言的实例代码演示教你如何免费获取股票数据(实时数据、历史数据
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......