Android序列化中由于修改类的内容造成InvalidClassException的解决方案

好多年没写博文了,我果然没救了。不过这篇文章定义应该是符合并不是互联网里满大街的知识点的要求吧。

问题回顾

在我的Exlink2.0版本升级到2.1中,之前保存的规则信息全部被清空了,而我的规则信息是通过对象序列化存储的。经初步排查,报错信息为

java.io.InvalidClassException: com.xloger.exlink.app.b.c; Incompatible class (SUID): com.xloger.exlink.app.b.c: static final long serialVersionUID =86222585354990243L; but expected com.xloger.exlink.app.b.c: static final long serialVersionUID =-4642583507468338732L;

解决这个报错的方案网上有很多,但是尝试后并没有解决我的问题,因此写下这篇博文。

序列化与serialVersionUID

序列化就是将一个对象转换为一个字节序列(目的是能存储和传输对象)。而上面的InvalidClassException恰好就是在反序列化(将一个字节序列转换回一个对象)时会产生的。

而这个InvalidClassException的原因是这样的:在一个对象(比如继承自Rule类)与字节序列的相互转换中,必然需要一个标记来证明它是Rule类的对象,否则谁知道你是Rule类还是String类还是什么,那没法反序列化了。因此,Java规定了一个属性serialVersionUID来区分它们,这个属性是可以在你需要序列化的类里申明的,比如这样:

private static final long serialVersionUID=10086L;

设定为private是为了不被子类继承。当然了,大部分人会说我以前没写过serialVersionUID啊,都是继承了Serializable接口就没了啊,是的,当没有申明serialVersionUID的时候,JVM会自动地根据包名、类名、继承关系、非私有的方法和属性,以及参数、返回值等诸多因子计算出一个值。比如我的Exlink在2.0版本之前,它给我计算的这个值为86222585354990243L,而在2.1版本中我对Rule类做了一些修改,导致该serialVersionUID变成了-4642583507468338732L。因此虽然我做的改动并不会真的影响到反序列化,但是JVM依旧会认为这有问题,因此抛出了InvalidClassException。

Ok,解决方案很简单,为了兼容以前的版本,我仅仅需要在Rule类里把serialVersionUID定义为86222585354990243L,这样JVM在反序列化的时候依旧会把最新版的Rule和旧的Rule当成一个来处理了。

也许有人会纳闷一些兼容性的问题,首先分成向上兼容、向下兼容两种。假如我们的新版增加了一个属性比如age,向上兼容就是旧的客户端读取新的数据,这里JVM会自动把那些它不认识的数据忽略掉(比如age),所以只要不改动旧属性,不用担心向上兼容的问题。向下兼容是新的客户端读取旧的数据,对于新的属性都会为Java里该类型的默认值,比如null、0、false这些。哪怕你定义你的成员变量private int age=12,这里的值依旧是0。那想做向下兼容应该怎么处理呢,就是在读取数据之后进行检测,判断是旧版本后手动初始化,比如可以维护一个当前类的版本的变量来判断。或者Android可以直接读取程序的versionCode来作为判断变量。

继续阅读“Android序列化中由于修改类的内容造成InvalidClassException的解决方案”

我懂个P

前言(废话):本来秉承着我的博文一定要是“能解决不能轻易通过搜索引擎解决的问题”的,但是太久没更新了实在于心有愧,决定怒水一发!【虽然前几篇也很逗逼似乎……

天空是蓝色的,我的PPT也始终是一个款式的……自从在大一看过阿文的那部《PPT扁平化手册》后,做的所有PPT都是参考他的风格,但不得不说他的风格真的挺不错的。

于是乎,在“多媒体信息与技术”老师布置的给学校老师一个PPT模板的作业以后,我毅然决定造一个轮子!把这种扁平化风格PPT推广给大众!有需要的可以直接使用我制作的模板:

首页一号:

首页1号

另一种首页:

首页二号

第三种首页:

首页三号

咳咳,虽然我也觉得挺挫的,但没事我会慢慢改,欢迎提意见…….

继续阅读“我懂个P”

晕车药的原理与选购

因为妈妈会晕车,所以准备在年前找款合适的晕车药,于是便查了一些资料,总结了这篇文章。

想要赶紧吃药的可以直接看第三部分。

一、晕车的原理

晕车,学名叫做“晕动病”。原理是什么呢,人体有一个感受平衡的器官叫内耳前庭器。它会不断地感受你的运动状态并传递信息给神经中枢的,当它传递的速度超过一个值的时候,人体就会出现不适症状,也就是晕车了。

当然,每个人的这个值是不一样的,也是可以锻炼的,所以长期坐车是可以克服晕车的。

再当然,以上是“晕动病”的原理,现实中的晕车还可能因为车内封闭二氧化碳浓度高,或者汽油味刺激等等原因,对于这些最好的办法还是打开窗户透气。

(扩展阅读“晕车的反应为什么是呕吐”:当人出于视觉封闭运动环境中,人看到的是车厢内静止的物体,视觉告诉此时人是静止的,此时内耳等负责调节平衡的器官却因人的运动产生了相应的反应并传送相应的运动信息至大脑,这样大脑便得到两种不一致的信息。这样,大脑会得出结论,其中之一产生了幻觉,并且产生幻觉的原因是毒素的摄入。于是大脑作出反应,诱发呕吐,以清除假象的毒素,这样便产生了晕车的症状)

详细介绍:http://www.zhihu.com/question/24387967/answer/34062601 (比百度百科跟wiki写的都要清楚易懂)

二、晕车药的原理

晕车的话假如想快速解决有晕车药与晕车贴两种办法(长期的话只能靠反复坐车刺激),需要注意的是它们都只是减缓晕车的症状,并不是治疗晕车。晕车贴由于需要比较长时间生效(须提前五六小时)所以没有去了解,主要介绍晕车药。

首先,是一类关于肠胃类的药,比如吗丁啉、胃复安一类的。可能有些人会介绍它们,但是我认为它们并没有什么帮助。它们可能能减缓你的呕吐症状,但是对于晕车本身是没有减缓的,所以基本上就会是一种想吐但吐不出的状态。(据说胃复安也有中枢性镇吐作用,所以它还是有帮助的)

晕车药的有效成分基本上都是抗组织胺剂,比如东莨菪碱是M胆碱受体阻断药、苯海拉明是H1受体阻断药。那它们的作用原理是什么呢?根据之前晕车的原理我们可以知道内耳前庭器收到过度的刺激,然后发消息(神经递质)给中枢系统,然后中枢系统采取应激反应。所以晕车药的原理基本上都是阻止内耳前庭器释放过多的神经递质,或者阻碍神经递质的传播来达到避免应激反应的目的。

当然,这样的“阻碍”会使大脑产生困倦感,也就是它们的副作用嗜睡。当然还有一些副作用就是口干舌燥,东莨菪碱还会有轻微的视力模糊。切记一次过多服用!

继续阅读“晕车药的原理与选购”

萌哒哒的装系统教程

Update 2017-02-24:删减废话,突出重点。

虽然网上有铺天盖地的装系统教程,但是始终没有一个我满意的。身为一名好备胎,在必要时刻能写一份深入浅出的重装教程是有责任心的表现,嗯。

这篇教程的特点是易懂,完整,不误导,有情怀。
对于想了解这个过程的人,每部分都有详细的解释;对于只要立刻装好的人,看加粗部分就好了。(请仔细理解目录)

全文分成四部分:
1. 装系统需要的知识储备
2. 制作部分
3. 安装部分
4. 完成后的一些事情


一、装系统需要的知识储备

1.1 装什么系统?

系统类型:全球的电脑系统可以分成三种:微软公司的Windows系统、苹果公司的OS X系统、自由开源的Linux系统。

OS X装起来问题很多,不推荐非 Mac 用户安装。需要装Linux的想必也不需要我的教程。所以在这里我只介绍Windows。

市面上主要的Windows版本有:windows xp(2001年发售)、windows 7(2009年发售)、windows 8(2012年发售)、windows 8.1(2013年发售)、windows 10(2015年发售)。

xp:它是一个十多年前的系统,并且微软已经停止技术支持了,所以无论是功能上还是安全性方面都不应该选择它。除非你的电脑是十几年前的电脑,否则你没理由继续使用它。(我家七年前的台式机跑 win8 依旧很流畅,所以不存在担心电脑配置从而装 xp 这种理由)
win7 :你非要用我也不拦着你,没啥问题。反正我觉得 win10 比它好用多了。
win8、win8.1:全面被win10代替。
win10:推荐。无任何特殊需求者都可以选择它。

系统位数:当你选择好了系统之后,会发现每个系统都有32位跟64位两种(32位有时会被写成 X86,比如64位系统 C 盘都有一个 Program Files (x86) 文件夹,里面放的便是32位软件)。这个是根据 CPU 来的,64位的 CPU 就是一次可以计算64位,32位的 CPU 一次只能计算32位,所以当然是64位的 CPU 更快)。于是,假如你的电脑 CPU 是32位的,那你只能装32位的操作系统,假如你的电脑 CPU 是64位的,那你电脑既可以装64位系统,也可以装32位系统。
所以除非你电脑 CPU 是32位的或者内存只有2G(此时你更应该加个内存条),否则你都应该选择64位的系统。64位可以支持4G以上的内存,64位的运行速度更快,64位并不存在所谓的软件兼容性问题。
(ps:相反,现在有许多软件现在只有64位了,比如 ps。这样的话是无法在32位系统上使用的。)

正常电脑都是64位 CPU 了,不用想装64位系统就是了。

系统版本:Windows 系统都有很多版本,比如 win7 有家庭版、专业版、旗舰版等;win10 有普通版、专业版、企业版。装看上去最好的版本就是了,win7 装旗舰版,win10 装专业版。

总结:假如你不愿看上面那些介绍,那你可以选择 windows 10 专业版 64位。

继续阅读“萌哒哒的装系统教程”

新的开始

博客大概开了两年了吧,不过一直没投入啥精力。在前段时间数据库挂了之后,就决定重新开始了。

当时就决定挑个吉祥日子的,居然一直拖到现在了……

 

还有半年就要滚出学生时代了,对自己的实力还是不忍直视呢,那就慢慢走吧。

前路已经确定,剩下的只有坚持了。愿他们与你同在。

以上。