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的序列化 为什么实现了 ...
随机推荐
- 在PreparedStatement中设置空值
在PreparedStatement中设置空值 分类: Work& Study java2009-09-10 09:56 922人阅读 评论(0) 收藏 举报 nulltypes数据库 ...
- Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)
在使用Entity Framework加载关联实体时,可以有三种方式: 1.懒加载(lazy Loading); 2.贪婪加载(eager loading); 3.显示加载(explicit load ...
- java 线程之间通信以及notify与notifyAll区别。
jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...
- MSI文件静默安装
以.net4为例,以下命令为静默安装: dotNetFx40_Full_x86_x64.exe /q /norestart /ChainingPackage FullX64Bootstrapper / ...
- 走进C标准库(2)——"stdio.h"中的fopen函数
其他的库文件看起来没有什么实现层面的知识可以探究的,所以,直接来看stdio.h. 1.茶余饭后的杂谈,有趣的历史 在过去的几十年中,独立于设备的输入输出模型得到了飞速的发展,标准C从这个改善的模型中 ...
- log实例
配置详解见2014.10月篇 log4j的pom.xml <dependency> <groupId>log4j</groupId> <artifactId& ...
- Kotlin Vertx
Kotlin & Vertx Kotlin 是一门好语言,值得大家了解一下. Vertx 是一个好框架,也值得大家了解一下. Kotlin 写过js,也写过一点点go,主力一直是java.用了 ...
- 基于Socket的UDP和TCP编程介绍
一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...
- MRP工作台任务下达之计划组为必输
应用 Oracle Manufacturing Planning 层 Level Function 函数名 Funcgtion Name MRPFPPWB 表单名 Form Name MRPS ...
- [Leetcode][Python]24: Swap Nodes in Pairs
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 24: Swap Nodes in Pairshttps://oj.leetc ...