java中的序列化 (r4笔记第64天)

java中的序列化是一个很有意思的接口,只需要声明而无需做额外的工作,但是在虚拟机内部却做了大量的工作保证了这一特点。只要对象实现了序列化接口,就会把它转换为一个字节序列,当需要的时候能够把这个字节序列完全恢复为原来的对象。这一过程是可以通过远程调用,网络进行,所以说从某种程度而言,序列化能够实现轻量级的持久化。 我们通过一个简单的程序来模拟说明, 假设我们需要打印张大爷的银行流水信息。 我们定义一个银行流水类,存钱类,取钱类 这里存钱的过程我们可以理解为序列化。 取钱的过程我们可以理解为反序列化。 这两个过程在这个例子中式完全独立的。 银行流水类

import java.io.Serializable; 



public class Bank_Transaction implements Serializable { 

 

 private String customer_name; 

 

 private double amount ;



 public String getCustomer_name() {

 return customer_name;

 }



 public void setCustomer_name(String customer_name) {

 this.customer_name = customer_name;

 }



 public double getAmount() {

 return amount;

 }



 public void setAmount(double amount) {

 this.amount = amount;

 } 

 

 

}

存钱类

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
 
public class Topup {  
 
    public static void main(String[] args) throws Exception {  
        Bank_Transaction bank_trx_write = new Bank_Transaction();  
        bank_trx_write.setAmount(1005);
        bank_trx_write.setCustomer_name("Mr Zhang");


        FileOutputStream fos = new FileOutputStream("Bank_trxs",false);  
        ObjectOutputStream oos = new ObjectOutputStream(fos);  
        oos.writeObject(bank_trx_write);  
        oos.close();  
        fos.close();
        System.out.println(bank_trx_write.getCustomer_name()+" top up amount: "+bank_trx_write.getAmount());
 
    }  
 
}  

取钱类

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class Withdraw {  
 
    public static void main(String[] args) throws Exception {  
 
        FileInputStream fis = new FileInputStream("Bank_trxs");  
        ObjectInputStream ois = new ObjectInputStream(fis); 
        Bank_Transaction bank_trx_read; 
        bank_trx_read =(Bank_Transaction) ois.readObject();
        System.out.println(bank_trx_read.getCustomer_name()+" withdraw amount: "+bank_trx_read.getAmount());    
    ois.close();  
        fis.close();
        }
 
}

在这个过程中,张大爷存了一笔钱,这些信息对于取钱类是完全屏蔽的。 我们运行一下存钱类,先存入一笔钱 [ora11g@rac1 test]$ $ORACLE_HOME/jdk/bin/java Topup Mr Zhang top up amount: 1005.0 这个时候会生成一个文件,Bank_trxs 通过strings得到的内容如下,因为这个文件是二进制文件,通过strings得到的内容还是能够看出一些眉目来。 [ora11g@rac1 test]$ strings Bank_trxs Bank_Transaction amountL customer_namet Ljava/lang/String;xp@ Mr Zhang 这个时候我们运行取钱类来看看,取钱的时候发现当时存了1005 [ora11g@rac1 test]$ $ORACLE_HOME/jdk/bin/java Withdraw Mr Zhang withdraw amount: 1005.0 java的这种持久化机制会在虚拟机内部实现,反序列化也只有java自身才能实现,这也是Java的一种持久化方案吧,对于更具有互操作性的方案就是xml,毕竟xml还是通用并且普遍使用的一种文件格式。 序列化在其它软件中也有体现,在Hadoop中的实现据称更加轻量级,简便,我们在后面继续讨论。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-03-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

【插件开发】—— 9 编辑器代码分块着色-高亮显示!

前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭...

2906
来自专栏菩提树下的杨过

Silverlight:获取ContentTemplate中的命名控件

项目开发中遇到一个要求,需要将ComboBox右侧中的小三角箭头给去掉,通过Blend工具“编辑ComboBox的模板副本”得知,这是一个名为"BtnArrow...

2198
来自专栏听雨堂

Android新手之旅(4) 通过HTTP访问web

1、访问web manifest中应该增加一个 <uses-permission android:name="android.permission.INTER...

2069
来自专栏闻道于事

Java实现word文档在线预览,读取office(word,excel,ppt)文件

9.5K7
来自专栏祝威廉

对Spark的那些【魔改】

这两年做streamingpro时,不可避免的需要对Spark做大量的增强。就如同我之前吐槽的,Spark大量使用了new进行对象的创建,导致里面的实现基本没有...

1631
来自专栏mukekeheart的iOS之旅

Bug修复问题

采用下面的代码,访问网页:http://www.weather.com.cn/data/cityinfo/101010100.html,想读取下图中红框中的内容...

2737
来自专栏JackieZheng

Spring读书笔记——bean加载

我们的日常开发几乎离不开Spring,他为我们的开发带来了很大的便捷,那么Spring框架是如何做到方便他人的呢。今天就来说说bean如何被加载加载。 我们在x...

2209
来自专栏ccylovehs

NoClassDefFoundError

在new JettisonMapperdXmlDriver()对象时 其构造器如下

4483
来自专栏菩提树下的杨过

silverlight中顺序/倒序异步加载多张图片

相册/图片切换广告等很多常用小应用中,服务器返回一组图片的uri,然后silverlight利用WebClient异步加载,如果要严格控制加载顺序的话,可以利用...

2177
来自专栏DT乱“码”

通过HTTP访问接口,工具方法

/* * 通过HTTP访问接口, * 详情,返回一个Map对象 */ public static Map<String,Object> callByHT...

3199

扫码关注云+社区

领取腾讯云代金券