对象序列化Serializable
一、Java对象的存储
首先我们先来理解一下Java对象在内存中的存储!
JVM的内存分为三个部分:栈(stack)、堆栈(heap)、方法区(method area):
栈:主要存储基本数据类型变量、方法的形参、引用数据类型等;
堆栈:存储实例对象;
方法区:存储静态变量(静态常量池)、class信息等
如:当new出来一个对象后,对象的引用在栈中分配,指向堆中的实例对象;当局部对象变量使用完后,引用立即从栈中回收,堆中的对象等待GC回收;
再如:数组,在栈中分配数据名,堆中保存数据的大小和实例元素。
因此,java程序中的对象实例默认都是直接存储在内存中,一旦内存中被回收或意外丢失,将无法重构;
这就涉及到了java对象的序列化!
二:什么是对象序列化
在JavaBean的文章中曾提到,serializable的目的是类属性的持久化存储。比如需要开发MySQL的存储,那么将一条记录写入MySQL中的时候就需要实现Serializable接口。
那么到底什么是对象序列化呢?
对象序列化就是将对象实例的状态(是属性,不包括方法)保存到文件或者其它数据库,并且可以通过反序列化的方式对对象进行重构。
(对象序列化将内存中的变量实例(如JavaBean中的User bean)转换为二进制流,更加高效地在网络或存储介质上进行传输)
三:序列化示例
假设有如下类LoginUser,定义有username和password两个属性,main函数中创建了一个LoginUser对象,username值为50,password值为30;
然后将当前LoginUser对象的属性值保存到文件foo.ser中。
import java.io.*;
public class LoginUser {
private String username;
private String passwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public static void main(String[] args){
LoginUser loginUser = new LoginUser();
loginUser.setUsername("");
loginUser.setPasswd("");
try{
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(loginUser);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
此时,运行该代码会出现如下异常:
java.io.NotSerializableException: com.longshine.zwp.test.LoginUser
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:)
at com.longshine.zwp.test.LoginUser.main(LoginUser.java:)
提示找不到对应的序列化类型,需要对LoginUser类定义做出如下修改:
public class LoginUser implements Serializable{
}
四、序列化注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)静态变量不能做序列化;
e)并不是所有的对象都能做序列化,比如Thread、socket等不能被序列化。
对象序列化Serializable的更多相关文章
- 【java】对象序列化Serializable、transient
package 对象序列化; import java.io.Serializable; @SuppressWarnings("serial") class A implements ...
- JAVA 对象序列化——Serializable
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object st ...
- JAVA 对象序列化——Serializable(转)
文章出自:http://www.cnblogs.com/chenfei0801/archive/2013/04/05/3001149.html Java的对象序列化是指将那些实现了Serializab ...
- android 传递 类对象 序列化 Serializable
public class Song implements Serializable { /** * */ private static final long serialVersionUID = 64 ...
- C#[Serializable]在C#中的作用-NET 中的对象序列化
为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...
- Serializable在C#中的作用.net中的对象序列化 (转)
序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...
- JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码
JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...
- 每天进步一点点-Java IO操作-Java Serializable(对象序列化)的理解和总结
往硬盘文件里写数据 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.在另一端,反序列化将从该流重 ...
- C# Serializable对象序列化的作用
http://www.cnblogs.com/linlf03/archive/2011/11/03/2234424.html 1.序列化定义:将对象转换为容易传输的格式的过程.例如,可以序列化一个对象 ...
随机推荐
- CentOS7 Nginx安装及配置反向代理
背景: Mono (Mono JIT compiler version 5.4.0.201 ) jexus-5.8.2-x64(<CentOS7 安装 jexus-5.8.2-x64>) ...
- BEM的命名规则
给自己提个醒,别乱命名了
- H5和CSS
参考文档:https://blog.csdn.net/caseywei/article/details/81105544 *)DOCTYPE的作用 如:<!DOCTYPE html> 标 ...
- Gym 101606 - A/B/C/D/E/F/G/H/I/J/K/L - (Undone)
链接:https://codeforces.com/gym/101606 A - Alien Sunset 暴力枚举小时即可. #include<bits/stdc++.h> using ...
- 推荐一个Monokai风格的EditPlus配色方案
如何配置 找到EditPlus的配置文件editplus_u.ini,该文件默认在:系统盘:\Users\用户名\AppData\Roaming\EditPlus目录中.将其中的内容替换为如下即可: ...
- android上的bin/sbin/xbin等各种目录
1. /system是用于存储 由AOSP构建生成的 不可变组件的 主要Android目录.这包括本机二进制文件,本机库,框架包和存储主要的应用程序.它通常是从根文件系统的单独映像中以只读方式挂载的, ...
- VUE-007-通过路由 router.push 传递 query 参数(路由 name 识别,请求链接显示参数传递)
在前端页面表单列表修改时,经常需要在页面切换的时候,传递需要修改的表单内容,通常可通过路由进行表单参数的传递. 首先,配置页面跳转路由.在 router/index.js 中配置相应的页面跳转路由,如 ...
- 国际快递查询接口JAVA示例-trackingmore
国际快递查询接口 国际快递查询接口的需求量很大,例如一些跨境电商B2C网站.快递查询APP.快递柜.跨境物流公司等都会需要用到国际快递接口. 目前市面上的快递接口,以国内快递居多,有些虽然号称支持多家 ...
- ADB——查看手机设备信息
查看设备信息 查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery ''' Current Batter ...
- [js]展开运算符
function f(...args){ console.log(args); } f(1,2,3,4,5) [...args] = [1,2,3,4] function f(...args){ co ...