Java的序列化
1、为啥需要序列化
在Java编程时,一个类被实例化以后,Java虚拟机使得对象处理生存状态,但是当虚拟机关闭后,对象就不复存在了,所以一个对象的生存期不会超过JVM的工作时间,那么如何才能让对象持续存在呢?Java的序列化API提供了相关的方法。当然,在RMI中或者将对象在网络传输时都需要其象序列化。本文就对象的持久化进行阐释,RMI和网络传输的序列化应用,以后慢慢说。
2、如何进行序列化。
Java的API为对象的序列化提供了简单强大的方式:实现Serializable。那到底怎么用呢?直接看例子,例子比任何理论都来的直接。
首先,我们定义一个类 book,这个类有三个成员变量:author,price、date;{作者,价格、出版日期}。如何将其序列化并且保存到文件中呢?看代码。
public class book implements Serializable
{
private String author;
private float price;
private Date date; public book(){ System.out.println("Empty Constructor");
} public book(String a; float p; Date d){
this.author = a;
this.price = p;
this.date = d;
System.out.println("Arguments Constructor");
} public String getAuthor(){
return this.author;
}
public float getAuthor(){
return this.author;
}
public Date getAuthor(){
return this.author;
}
public void setAuthor(String a){
this.author = a;
}
public void setPrice(float p){
this.price = p;
}
public void setDate(Date d){
this.date = d;
} public static void main(String args[])
{
book b = new book("you",99.99,new Date()); File file = new File("booklist"); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); out.writeObject(b);
out.close(); ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
Object in_book = in.readObject();
in.close();
System.out.println( in_book.getAuthor()+ " " + in_book.getPrice() + " " + in_book.getDate());
}
}
当然,这个代码我没测试过,有兴趣不?要不要自己试试?但是要记住一点:确保该读取程序的CLASSPATH中包含有book.class(哪怕在读取book对象时并没有显示地使用这个类),否则会抛出ClassNotFoundException。
3、我想自己写序列化的过程咋办。
要是觉得不想这么中规中矩的使用Serializable进行序列化,那可以用序列化的继承子类Externalizable接口实现自己的序列化。咋用啊?继续看代码。
public class book implements Externalizable
{
private String author;
private float price;
private Date date; public book(){ System.out.println("Empty Constructor");
} public book(String a; float p; Date d){
this.author = a;
this.price = p;
this.date = d;
System.out.println("Arguments Constructor");
} public String getAuthor(){
return this.author;
}
public float getAuthor(){
return this.author;
}
public Date getAuthor(){
return this.author;
}
public void setAuthor(String a){
this.author = a;
}
public void setPrice(float p){
this.price = p;
}
public void setDate(Date d){
this.date = d;
} @Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(author);
out.writeInt(age);
} @Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
author = (String) in.readObject();
age = in.readInt();
}
}
关键还是看俩函数 writeExternal() 、readExternal()。这俩函数可以让程序员自己决定到底用什么样的方式进行序列化。注意:序列化的是类的成员变量,成员函数不会序列化,所以自己写序列化别把函数什么的也写进去,写了?那就只能“呵呵”。。。
人懒的好处就是胆子大,这个代码我也没测过,直接贴。
4、 还有一个关键字我没写:transient。这个关键字可以让某些成员变量不被序列化,咋用呢?google知道,去问吧。
Java的序列化的更多相关文章
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- JAVA的序列化和持久化的区别与联系
持久化(Persistence) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文 ...
- 理解Java对象序列化
http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- Java的序列化ID的作用
Java的序列化ID的作用 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersio ...
- Java基础-序列化
Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法: 为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判 ...
- java 对象序列化
java 对象序列化 package org.rui.io.serializable; import java.io.ByteArrayInputStream; import java.io.Byte ...
- 理解Java对象序列化(二)
关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...
- 关于 Java 对象序列化您不知道的 5 件事
数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...
- 深入分析Java的序列化与反序列化
序列化是一种对象持久化的手段.普遍应用在网络传输.RMI等场景中.本文通过分析ArrayList的序列化来介绍Java序列化的相关内容.主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了 ...
随机推荐
- 理解JS闭包
从事web开发工作,尤其主要是做服务器端开发的,难免会对客户端语言JavaScript一些概念有些似懂非懂的,甚至仅停留在实现功能的层面上,接下来的文章,是记录我对JavaScript的一些概念的理解 ...
- SqlServer之触发器
1.触发器之理论: 触发器(Trigger)是一种特殊类型的存储过程,是在用户对某一种表的数据进行UPDATE.INSERT 和 DELETE 操作时被触发执行的一段程序.触发器有助于强制引用完整性, ...
- JavaWeb Filter--过滤器 简介
本文转载自:http://blog.csdn.net/wanghuan203/article/details/7325651 过滤器就是在源数据和目的数据之间起过滤作用的中间件. Web应用中,在处理 ...
- poj 1149 pigs ---- 最大流
题意以及分析:http://ycool.com/post/zhhrrm6#rule3 主要是建图,简化图,然后在套最大流的模板. #include <iostream> #include& ...
- Euclid gcd规则的证明
Euclid 规则:如果x和y都是正整数,而且x>=y,那么gcd(x,y)=gcd(x mod y, y) 假设x和y的gcd为a,那么必然有 x=a*n1 y=a*n2(gcd(n1,n2) ...
- Java 7源码分析第13篇 - 字节输入输出流(1)
上一篇介绍了关于字节输入输出流的Java类框架,同时也简单介绍了一下各个类的作用,下面就来具体看一下这些类是怎么实现这些功能的. 1.InputStream和OutputStream InputStr ...
- activiti框架 数据库设计说明
1.结构设计 1.1. 逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...
- LeakCanary,检测安卓,java内存泄漏
官方中文API地址:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
- 转:Server.MapPath相关
如果你从Page类继承的类中执行这条语句,才可以简单地使用 DataBase = Server.MapPath("data.mdb");否则写全命名空间:System.Web.Ht ...
- 图的邻接链表实现(c)
参考:算法:C语言实现 一书 实现: #ifndef GRAPH #define GRAPH #include<stdio.h> #include<stdlib.h> stru ...