文档章节

初探Java Serializable

汉堡OSC
 汉堡OSC
发布于 2017/02/23 17:40
字数 407
阅读 12
收藏 0

Java序列化用于对象的持久化存储或网络传输。所有的支持序列化的类都要实现Serializable接口,在官方源码中,该接口是一个空接口,如图

image

这也说明了interface的作用。对于序列化的原理,目前猜想流程大概是:与ObjcetOutputStream有关,相关的流类对对象进行序列化之前先使用暴力反射检查该类是否实现了Serializable接口,然后将该对象的各个字段转成二进制输出到文件或者网络流中。还原:先根据类创建一个空白对象,然后把反序列化后的字段赋值给空白对象。

有一点注意,transient关键字修饰的字段不会被序列化,反序列化后会得到null值。

具体的细节可以参考java中Serializable接口的理解(别人写过的我就不写了。)

上一个简单的demo

package com.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


/**
 * @author EQ
 * 用于测试transient关键字
 */
public class Test {
	public static void main(String[] args) throws Exception {
		People p=new People(18, "tom", "huaian");
		writeObject(p);
		readObject();
		
	}
	public static void writeObject(People p) throws Exception{
		FileOutputStream fout=new FileOutputStream("d://obj.txt");
		ObjectOutputStream out=new ObjectOutputStream(fout);
		out.writeObject(p);
		fout.close();
	}
	public static void readObject() throws Exception{
		FileInputStream fin=new FileInputStream("d://obj.txt");
		ObjectInputStream in=new ObjectInputStream(fin);
		People p=(People) in.readObject();
		fin.close();
		System.out.println(p.name);
		System.out.println(p.getAge());
		System.out.println(p.getAddress());
		System.out.println(p.tag);
	}
}

class People implements Serializable{
	public static int tag=100;
	private int age;
	public String name;
	transient String address;
	public People(int a,String name,String add){
		this.age=a;
		this.name=name;
		this.address=add;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
}

 

 

如有错误,还请不吝指出。

© 著作权归作者所有

共有 人打赏支持
汉堡OSC

汉堡OSC

粉丝 4
博文 24
码字总数 16013
作品 0
宝山
后端工程师
Understand The SerialVersionUID

If you have ever implemented Serializable interface, you must encounter this warning message The serializable class xxx does not declare a static final serialVersionUID field of......

neumeng
2014/03/14
0
0
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
06/21
0
0
Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释 ...

KingMing
2015/04/16
0
0
serialVersionUID作用

Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较...

stefanzhlg
2015/03/23
0
0
(1)java序列化--java.io.Serializable接口解析

(PS:本文为作者原著,如需转载,请注明出处-_^) 使用java以来,序列化随处可见,至于为什么要用序列化、序列化能解决什么问题,作为一个普通的码农,一般不怎么会去深入研究,由于最近在看...

sumekey
2011/09/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

smart-doc特殊功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
0
0
JavaEE——Junit

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Junit Junit又名单元测试,Junit是用来测试Jav...

凯哥学堂
昨天
0
0
读《美丽新世界》

一、背景 十一国庆节从重庆回深圳的时候,做得绿皮车,路上看了两本书:李笑来的《韭菜的自我修养》和禁书《美丽新世界》。 上篇文章已经分享了 读《韭菜的自我修养》,这篇文章来记录一下《...

tiankonguse
昨天
0
0
archlinux下基于Jenkins,docker实现自动化部署(持续交互)

本文永久更新地址:https://my.oschina.net/bysu/blog/2250954 【若要到岸,请摇船:开源中国 不最醉不龟归】 -----------------------------------第一部分Jenkins的安装与使用-----------...

不最醉不龟归
昨天
0
0
Spark Parquet file split

在实际使用 spark + parquet 的时候, 遇到了两个不解的地方: 我们只有一个 parquet 文件(小于 hdfs block size), 但是 spark 在某个 stage 生成了4个 tasks 来处理. 4个 tasks 中只有一个 ta...

Aaaaaaaron
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部