一、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的更多相关文章

  1. 【java】对象序列化Serializable、transient

    package 对象序列化; import java.io.Serializable; @SuppressWarnings("serial") class A implements ...

  2. JAVA 对象序列化——Serializable

    1.序列化是干什么的?       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object st ...

  3. JAVA 对象序列化——Serializable(转)

    文章出自:http://www.cnblogs.com/chenfei0801/archive/2013/04/05/3001149.html Java的对象序列化是指将那些实现了Serializab ...

  4. android 传递 类对象 序列化 Serializable

    public class Song implements Serializable { /** * */ private static final long serialVersionUID = 64 ...

  5. C#[Serializable]在C#中的作用-NET 中的对象序列化

    为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...

  6. Serializable在C#中的作用.net中的对象序列化 (转)

    序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...

  7. JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

    JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...

  8. 每天进步一点点-Java IO操作-Java Serializable(对象序列化)的理解和总结

    往硬盘文件里写数据 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.在另一端,反序列化将从该流重 ...

  9. C# Serializable对象序列化的作用

    http://www.cnblogs.com/linlf03/archive/2011/11/03/2234424.html 1.序列化定义:将对象转换为容易传输的格式的过程.例如,可以序列化一个对象 ...

随机推荐

  1. css3 属性

    1.css 面试题: css 组成: css 样式组成 规则:选择器+声明块 声明块:css属性+css属性值 2.css 解析规则: 从右往左 3.文字超出省略号显示: 1.元素不是内联块 2.ov ...

  2. nginx r日志中午出现\xE5\x88\x98\xE4\xB8\x96\xE5\xA5\x87

    参考文档: https://www.cnblogs.com/hark0623/p/5715726.html https://www.cnblogs.com/fqfanqi/p/7900758.html ...

  3. MySQL 详细学习笔记 转

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

  4. c++函数strapy

    头文件:#include <string.h> 定义函数:char *strcpy(char *dest, const char *src); 函数说明:strcpy()会将参数src 字 ...

  5. 洛谷P4204 [NOI2006]神奇口袋 数论

    正解:数论 解题报告: 传送门 第一次用\(\LaTeX\)和\(markdown\),,,如果出了什么锅麻烦在评论跟我港句QAQ \(1)x_{i}\)可以直接离散 \(2)y_{i}\)的顺序对结 ...

  6. FPC导通阻抗计算

    pc线路板是有导电功能的,那么如何仅适用手工计算出线路的阻值能?那么就需要使用到一个公式: W*R*T=6000 W是指铜箔的宽度单位是密耳mil. T是指铜箔厚度单位是盎司oz. R是指铜箔的电阻单 ...

  7. 极客时间 深入拆解java虚拟机 一至三讲学习总结

    为什么要学习java虚拟机 1.学习java虚拟机的本质,是了解java程序是如何被执行且优化的.这样一来,才可以从内部入手,达到高效编程的目的.与此同时,你也可以为学习更深层级.更为核心的java技 ...

  8. curl 支持 http2

    让 curl 支持 HTTP2 我们需要安装 nghttp2(http2 的 C 语言库) 源码安装 安装 nghttp2 git clone https://github.com/tatsuhiro ...

  9. FB面经Prepare: Dot Product

    Conduct Dot Product of two large Vectors 1. two pointers 2. hashmap 3. 如果没有额外空间,如果一个很大,一个很小,适合scan小的 ...

  10. phpstorm----------phpstorm如何安装和使用laravel plugin

    1.安装 2.安装成功以后,删除项目里面的.idea文件.然后关闭phpstrom,重新打开该项目,就会提示你 然后.idea里面就会生成 laravel-plugin.xml 文件.就可以使用直接C ...