文档章节

初探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
Android Serializable与Parcelable原理与区别

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

KingMing
2015/04/16
0
0
【目录导航】JAVA零基础进阶之路

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

MFrank
06/21
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java IO类库之PrintStreamWriter

* A <code>PrintStream</code> adds functionality to another output stream, * namely the ability to print representations of various data values * conveniently. Two other fea......

老韭菜
49分钟前
0
0
qduoj~前端~二次开发~笔记

青岛大学qdu的onlinejudge是js的写的前端,框架是vue.js,在nodejs上部署运行,其实整体运行还是建立在docker的容器虚拟环境里,这里暂时不需要docker。安装环境是Ubuntu14-64bit 1.安装一大...

虚拟世界的懒猫
53分钟前
6
0
ConcurrentHashMap源码解读

部分内容转自:http://jiabinyuan.xyz/#/app/archive/detail/25 内部结构 内部采用了segment结构,每一个segment相当于一个hashtable。看下面的结构图: 从图的结构我们可以了解到,Concurr...

edwardGe
58分钟前
1
0
Ubuntu终端Tab键自动补全

打开 /etc/bash.bashrc,找到下列代码,取消注释。 #enable bash completion in interactive shells#if ! shopt -oq posix; then# if [-f /usr/share/bash-completion/bash_compl......

大熊猫
今天
0
0
polipo socks5代理转http代理

天朝的网络,哎~ 装个 yarn 都时而会卡 假设在SSlocal 已经装好运行的前提下,来安装设置 polipo sudo apt-get install polipo sudo vim /etc/polipo/config 追加下列配置内容,并保存 socksP...

纯洁徐
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部