马桶Java:1.Serializable 实现它做什么?

马桶🚽Java 上厕所就能看完的小知识! 欢迎关注、点赞 持续更新!

我们都知道,在学习对象序列化反序列化的时候都需要实现一个Serializable接口
可是我们点进去一看,这个接口长这个样子

/
 * @author  unascribed
 * @see java.io.ObjectOutputStream
 * @see java.io.ObjectInputStream
 * @see java.io.ObjectOutput
 * @see java.io.ObjectInput
 * @see java.io.Externalizable
 * @since   1.1
 */
public interface Serializable {
}

没错 他是个空的

image.png

所以我们需要先搞清楚什么是序列化?
序列化的含义就是:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
emmmm
说白了就是保存到硬盘或者其他地方进行存储一下!
那我们不妨做个小东西实验一样!爷天生傲骨,就不实现又能怎么样?
先上代码!

public class Person  {
//    private static final long serialVersionUID = 291613027204248679L;

    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

}
    private static void ObjectWriter() throws IOException {
        FileOutputStream fos=new FileOutputStream("D:\\IO\\Person.object");
//        对象储存文件的规范
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        oos.writeObject(new Person("Alien",21));
        oos.close();
}

当我们点击运行!他报错了!没实现Serializable !
错误信息如下

Exception in thread "main" java.io.NotSerializableException: it.test.domain.Person
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185)
    at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349)
    at it.test.domain.ObjectOutputStream_Test1.ObjectWriter(ObjectOutputStream_Test1.java:16)
    at it.test.domain.ObjectOutputStream_Test1.main(ObjectOutputStream_Test1.java:7)

这个时候!我们就可以顺腾摸瓜(查看报错信息)!找到到底是哪里导致程序出现的异常!
然后我们在ObjectOutputStream.java文件中发现了以下代码
节选:

 if (obj instanceof String) {
                writeString((String) obj, unshared);
            } else if (cl.isArray()) {
                writeArray(obj, desc, unshared);
            } else if (obj instanceof Enum) {
                writeEnum((Enum<?>) obj, desc, unshared);
            } else if (obj instanceof Serializable) {
                writeOrdinaryObject(obj, desc, unshared);
            } else {
            // 如果 都不符合 就会准备报异常了!!
                if (extendedDebugInfo) {
                    throw new NotSerializableException(
                        cl.getName() + "\n" + debugInfoStack.toString());
                } else {
                    throw new NotSerializableException(cl.getName());
                }
            }

奥 ! 他会将传入的对象进行判断:是否是String?是否是枚举?是否是数组?是否实现Serializable
所以 对于源码查看 我们知道了如果他实现了Serializable 那么才会被处理! 这就是一种标识 !
如果他以上几种情况 (string array...)都不是!那么就会报出异常了!
原来如此!
所以这个东西:就是一种标识 !

不会被序列化的可怕家族!

当然!我们的设计师不能想着所有东西被序列化,那对象中有一些参数不想被序列化!(不!你不想!)我们该怎么办呢?
他们就是 statictransient
static 很好理解!这东西不归对象管,当你将属性声明成 static时,它就投靠了类 。
你序列化ObjectStream Object!!!是对象 管我类的小弟(static)啥事?
所以被static修饰的就无法序列化了!

transient 这东西就是java赋予你的神秘力量!毕竟我们不能把所有东西都设置成static,我们需要有属于对象的 不被序列化!
那么transient就登场啦 如果你不想让他即属于对象又不会被序列化 那么你就给属性添加该关键字!

 private transient int age;

这个时候 就不会被序列化了 当然每次反序列化都是默认值了!
但是理解归理解!这东西在java里面代码逻辑中到底是怎么实现的呢?
我们找到了ObjectStreamClass
中有如下代码:
这个方法 上面注释 我给大家翻译下!

返回与给定类声明的所有非静态非瞬态字段相对应的ObjectStreamFields数组
每个ObjectStreamField都包含一个其代表的字段的Field对象。
如果没有默认的可序列化字段,则返回NO_FIELDS

private static ObjectStreamField[] getDefaultSerialFields(Class<?> cl) {
       // 获取到序列化对象的参数数组
       Field[] clFields = cl.getDeclaredFields();
       ArrayList<ObjectStreamField> list = new ArrayList<>();
       int mask = Modifier.STATIC | Modifier.TRANSIENT;

       for (int i = 0; i < clFields.length; i++) {
       //判断是不是 非静态非瞬态字段
       // 添加所有 可序列化字段 进入ArrayList<ObjectStreamField> 然后进行后续操作
           if ((clFields[i].getModifiers() & mask) == 0) {
               list.add(new ObjectStreamField(clFields[i], false, true));
           }
       }
       int size = list.size();
       return (size == 0) ? NO_FIELDS :
           list.toArray(new ObjectStreamField[size]);
   }

没错 就是在这里判断的!
当然!Java序列化的本质就是将Java对象转化成字节数组来便于存储和传输的
这就是Java序列化一步非常重要的过程啦!


这里是🚽Java 每周不定时更新!喜欢的小伙伴可以点赞关注收藏哦!我们下个文章见!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351