文档章节

初探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
博文 26
码字总数 16921
作品 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
2018/06/21
0
0
一些关于 Java 序列化的面试问题

Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你...

红薯
2011/04/18
1K
6
基于Spring、Hibernate的通用DAO层与Service层的实现

因为DAO层基本的就是CRUD操作,变化不是很大,要是有变化的那就是查询。而确实没有必要为每一个实体写一个完整的DAO,但是没有还不行,那就“抽取”出来吧。而Service依赖与DAO层,有时就是简...

moz1q1
2014/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Nextjs+React非页面组件SSR渲染

@随风溜达的向日葵 Nextjs Nextjs是React生态中非常受欢迎的SSR(server side render——服务端渲染)框架,只需要几个步骤就可以搭建一个支持SSR的工程(_Nextjs_的快速搭建见Next.js入门)...

随风溜达的向日葵
46分钟前
0
0
如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
今天
3
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
今天
6
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
今天
4
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部