序列化:
Java 提供了一种把对象序列化的机制。
即把一个对象可以被表示为一个字节序列。然后可以写入文件保存。


字节序列包括:
     该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
有点和C语言的结构体类似。

反序列化:
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,提高一个对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中重新恢复出来一个“一样的”新对象。

序列化和反序列都是跨平台,和本地环境无关。
     因为整个过程都是Java虚拟机(JVM)独立的,平台无法的,所以跨平台。在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

类——都属于Java.io包
  • ObjectInputStream(对象输入流---反序列化)
  • ObjectOutputStream(对象输出流--序列化)
这俩类是高层次的数据流,它们包含序列化和反序列化对象的方法。

【注意点】
ObjectOutputStream 类里的 
public final void writeObject(Object x) throws IOException{
}  //序列化一个对象,并把它发送到输出流.

ObjectInputStream 类里的
public final Object readObject() throws IOException,ClassNotFoundException{
} //从流里面读取下一个对象,并将对象反序列化,但是你要注意它的返回值是object类型所以你要将它转为合适的数据类型也就是你要整了你需要的object对象类型。


Serializable 接口
  • 一个对象想要序列化。那么这个类必须继承Serializable接口。
    • javaAPI里的标准类是不是可以被序列化那么有查看原文档。看源文档有没有实现这个接口>
  • 这个类的所有属性必须是可序列化的,如果有一个属性不是可序列化的,则该属性必须注明是短暂的,必须注明。
transient--注明是短暂
这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

实现下。

【一个可序列化的类】

/**
* @author 谢杰
* 测试序列化。该类实现了serializable接口。
*/
public class Student implements java.io.Serializable{
public String name;
public String address;
public int account;
public <span style="background-color: rgb(102, 255, 153);">transient </span>int password; //transient password设置为不可序列化 public void mailCheck()
{
System.out.println("Mailing a check to " + name
+ " " + address);
}
}
【序列化】
 当序列化一个对象到文件时, 按照Java的标准约定是给文件一个.ser扩展名

import java.io.*;

public class StudentSerialize_Out {
public static void main(String [] args)
{
Student e = new Student();
e.name = "Vincent";
e.address = "harbin/china";
e.password = 11122333;
e.account = 101;
try
{
FileOutputStream fileOut =
new FileOutputStream("<span style="background-color: rgb(102, 255, 153);">F://Student.ser</span>");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in F://Student.ser");
}catch(IOException i)
{
i.printStackTrace();
}
}}

【成功输出在F盘。。。】

【我们用记事本打开 .ser查看里面的字符。】

可以看到没有
password

【反序列化】

import java.io.*;

public class StudentSerialize_Input {
public static void main(String [] args)
{
Student e = null;
try
{
FileInputStream fileIn = new FileInputStream("F://Student.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Student) in.readObject(); //注意这里要把返回来的object类型转换
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println("Student class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Student...");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("password: " + e.password);
System.out.println("account: " + e.account);
}
}

Java 序列化 和 反序列--by Vincent的更多相关文章

  1. Java常见序列化与反序列方法总结

    很多商业项目用到数据库.内存映射文件和普通文件来完成项目中的序列化处理的需求,但是这些方法很少会依靠于Java序列化.本文也不是用来解释序列化的,而是一起来看看面试中有关序列化的问题,这些问题你很有可 ...

  2. Java实现 LeetCode 449 序列化和反序列化二叉搜索树

    449. 序列化和反序列化二叉搜索树 序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法 ...

  3. Java 序列化与反序列化

    1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...

  4. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  5. Java序列化的几种方式以及序列化的作用

    Java序列化的几种方式以及序列化的作用 本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象 ...

  6. Java序列化机制

    java的序列化机制支持将对象序列化为本地文件或者通过网络传输至别处, 而反序列化则可以读取流中的数据, 并将其转换为java对象. 被序列化的类需要实现Serializable接口, 使用Objec ...

  7. Java学习笔记(十七)——java序列化

    [前面的话] 做项目总是要用到很多东西,遇到一个新的知识,并不是这个知识出来的时间短,而是对于自己来说是新的,所以就需要自己去学习,希望今后可以提高学习的效率. 这篇文章是关于Java 序列化的,选择 ...

  8. java序列化---转

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...

  9. [java]序列化框架性能对比(kryo、hessian、java、protostuff)

    序列化框架性能对比(kryo.hessian.java.protostuff) 简介:   优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ...

随机推荐

  1. C#趣味程序----分数之和

    问题:求这种四个自然数p,q,r,s(p<=q<=r<=s).使得等式1/p + 1/q +1/r +1/s=1成立. 分析:将原式同分,化简整理后得到:2<=p<5,p ...

  2. luogu2242 公路维修问题

    题目大意 把一个高速公路看作由连续排列的一个个格子组成,有n个格子上有坑.给出m,要求出m段区间,使得这m区间覆盖到所有坑(交通管制),且占据的格子数量最少.输出占据的格子数. 题解 换个角度看问题. ...

  3. Uva 11021(概率)

    题意:有k只麻球,每只只能活一天,但临死之前可能产生新麻球,生出i个麻球的概率为pi,给定m,求m天后所有麻球都死亡的概率 输入格式 输入一行为测试数据的组数T,每组数据第一行为3个整数n,k,m;已 ...

  4. 第18章 Redis数据结构常用命令

    18-1 字符串的一些基本命令 18-1 :配置Spring关于Redis字符串的运行环境 <bean id="poolConfig" class="redis.c ...

  5. 使用filezella服务器安装ftp

    使用FileZilla配置FTP站点,可参考以下步骤: 1.打开Filezilla Server服务端: 点击[Edit]->[Users],或者点击如下图标新增用户. 2.添加FTP帐号后,设 ...

  6. ROW_NUMBER() OVER()函数用法;(分组,排序),partition by (转)

    1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...

  7. 时间&物质&效率

    由于我的家庭是地道的农民家庭,在上学的时候,父母很辛苦的供我读初中,高中,大学. 现在我想说的是,用时间来换取效率是我求学时最大的遗憾. 举一个例子吧:每次回家坐火车,火车很费时间,假如我不缺钱,完全 ...

  8. 得到Xml中 元素的值

    <?xml version="1.0" encoding="utf-8" ?><Response service="RouteSer ...

  9. 【Oracle】审计

    1.审计的功能:监控用户在database 的 action (操作) 2.审计分类: 1) session :在同一个session,相同的语句只产生一个审计结果(默认) 2) access : 在 ...

  10. 【Five-Minute Share】数据库内存分配设置

    对于数据库分配的内存,经常会看到的一条准则是:将服务器75-80%的内存分配给数据库.这是一条比较常见的准则,但并不是绝对的.首先,我们需要保障操作系统运行本身所需的充足内存后,才能去考虑数据库所分配 ...