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的序列化的更多相关文章

  1. Java对象序列化剖析

    对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...

  2. JAVA的序列化和持久化的区别与联系

      持久化(Persistence) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文 ...

  3. 理解Java对象序列化

    http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...

  4. java 对象序列化与反序列化

    Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为 ...

  5. Java的序列化ID的作用

    Java的序列化ID的作用 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersio ...

  6. Java基础-序列化

    Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法: 为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判 ...

  7. java 对象序列化

    java 对象序列化 package org.rui.io.serializable; import java.io.ByteArrayInputStream; import java.io.Byte ...

  8. 理解Java对象序列化(二)

    关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...

  9. 关于 Java 对象序列化您不知道的 5 件事

    数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...

  10. 深入分析Java的序列化与反序列化

    序列化是一种对象持久化的手段.普遍应用在网络传输.RMI等场景中.本文通过分析ArrayList的序列化来介绍Java序列化的相关内容.主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了 ...

随机推荐

  1. 在PreparedStatement中设置空值

    在PreparedStatement中设置空值 分类: Work&amp Study java2009-09-10 09:56 922人阅读 评论(0) 收藏 举报 nulltypes数据库 ...

  2. Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)

    在使用Entity Framework加载关联实体时,可以有三种方式: 1.懒加载(lazy Loading); 2.贪婪加载(eager loading); 3.显示加载(explicit load ...

  3. java 线程之间通信以及notify与notifyAll区别。

    jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...

  4. MSI文件静默安装

    以.net4为例,以下命令为静默安装: dotNetFx40_Full_x86_x64.exe /q /norestart /ChainingPackage FullX64Bootstrapper / ...

  5. 走进C标准库(2)——"stdio.h"中的fopen函数

    其他的库文件看起来没有什么实现层面的知识可以探究的,所以,直接来看stdio.h. 1.茶余饭后的杂谈,有趣的历史 在过去的几十年中,独立于设备的输入输出模型得到了飞速的发展,标准C从这个改善的模型中 ...

  6. log实例

    配置详解见2014.10月篇 log4j的pom.xml <dependency> <groupId>log4j</groupId> <artifactId& ...

  7. Kotlin Vertx

    Kotlin & Vertx Kotlin 是一门好语言,值得大家了解一下. Vertx 是一个好框架,也值得大家了解一下. Kotlin 写过js,也写过一点点go,主力一直是java.用了 ...

  8. 基于Socket的UDP和TCP编程介绍

    一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...

  9. MRP工作台任务下达之计划组为必输

    应用 Oracle   Manufacturing Planning 层 Level Function 函数名 Funcgtion Name MRPFPPWB 表单名 Form   Name MRPS ...

  10. [Leetcode][Python]24: Swap Nodes in Pairs

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 24: Swap Nodes in Pairshttps://oj.leetc ...