嗯。话是这样说没错。但是我认为Java规定『序列化不能序列化static属性』更像是一种约定,或者说是硬性规定。
想吧,为什么Java不支持多继承?难道不是为了方便,为了方便开发者更好的使用Java进行开发,避免出错?
回归主题,之所以Java不支持序列化那些static属性,要从Java本身的语言特点进行分析:
public class {
...
public static void main(String[] args){
...
}
}
这便是Java的基本框架格式。
可以看出Java的所有代码都是被限制在class(类)中的。static关键字修身的静态属性,而总是和类相联系。
实现接口实现序列化。
比如:
public class Person implements {
...
public static void main(String[] args){
...
Person p = new Person();
//通过ObjectOutputStream将p实现序列化
}
}
再看Python,支持面向对象,但是却不向Java样的「死板」——代码只能限制在class中。
import pickle
d = {'1':1, '2':2}
pickle.dump(d)
这就进行了序列化。
相比于「Java只能序列化类的实例对象」,显然Python允许的对象范围更广。
而且Python也没有static关键字(为什么?我觉得很大一部分是因为它的脚本属性、它的灵活性,即既支持面向对象,也支持面向过程)。
综上,static属性为什么不能被序列化——这个问题似乎也只限于Java了(虽然C语言也有这样的关键字,但是含义不完全相同)。
我们应该跳出语言层面看到static深层次代表的东西。怎么说呢,绕来绕去,我觉得总结起来一句话:因为方便开发,就是这样的硬性规定——也是Java的语言特点。