- 浏览: 315738 次
- 性别:
文章分类
最新评论
-
i042416:
分析在哪?
angular分析 -
何盆盆:
你好,请问您这是Extjs3还是Extjs4
ExtJs源码分析与学习—ExtJs事件机制(一) -
124753561:
引用引用引用引用引用[u][u][u][u][i][i][i] ...
Subvision SVN 服务端与客户端的安装 -
谷超:
请问一下例子中itext是什么版本的?
利用iText生成word文档例子参考 -
geosmart:
正好要用到执行字符串中方法,学习了
java中利用反射机制实现调用给定为字符串的方法名
1. 什么是Serialization?
串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内在缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的位数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。
Java有Serialization API为开发者提供了一种标准的机制来串行化类。
2. 为什么要Serilzation?
特别地,串行化主要有三种用途:
1)作为一种持久化机制
如果使用的是FileOutputStream流的方式,则数据将被自动地写入文件中,
2)作为一种复制机制
如果使用的是
3)作为一种通信机制
如果是使用套接字(Socket)流的方式,则数据自动地通过网络连接传输一另一个端点,并由这个端点上的程序来决定做什么。
3. Serialization的基本用法:默认机制
将要串行化的类必须实现java.io.Serializable接口,或者是继承实现了该接口的类。然后通过java.io.ObjectOutputStream类来实现持久化,如果用保存到文件上还需要用到java.io.FileOutputStream类。因为ObjectOutputStream被认为是java.io包中的高级类所以可用它来包装低级的类FileOutputStream。在持久化过程中调用的一个方法是ObjectOutputStream对象的writeObject(obj)方法。
当要从文件中恢复对象时,则是使用java.io.OjbectInputStream与FileInputStream类,调用一方法是ObjectInputStream对象的readObject()方法。
示例1:
import java.io.*;
public class Cat implements Serializable {
private String name;
public Cat () {
this.name = "new cat";
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
import java.io.*;
public class CatDemo {
public static void main(String[] args) {
Cat cat = new Cat();
try { //串行化
FileOutputStream fos = new FileOutputStream("catDemo.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(" 1> " + cat.getName());
cat.setName("My Cat");
oos.writeObject(cat);
oos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
try { //反串行化
FileInputStream fis = new FileInputStream("catDemo.out");
ObjectInputStream ois = new ObjectInputStream(fis);
cat = (Cat) ois.readObject();
System.out.println(" 2> " + cat.getName());
ois.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
4. Serialization常见问题
正如前面提到的,所有可串行化的类必须直接或是通过继承方式间接地实现java.io.Serializable接口,由于Object类关没有实现这个接口,所以并不是所有类的对象都是可串行化的。像AWT与Swing的GUI组件、字符串、数组等都是可串行化的,而像一些系统级的类(Thread
问题一:如果在一个可串行化的类中Has-As不可串行化的类该怎么处理?
在这种情况下在运行时会抛出NotSerializableException。
为了解决类似问题,Java中提供了transient关键字来跳过对不可串行化类的对象的处理。但这依然可能会引起一些问题,在反串行化时,被标识为transient变量不会恢复到其原始状态,而是提供默认值,如示例2中的pig引用将赋值为null,age变量赋值为0;
附:基本类型和引用类型的默认值
对象引用:null
byte, short, int, long :0
float, double:0.0
boolean:false
char:'\u0000'(这是Unicode字符集的空格)
示例2:
假如在一个可以串行化的类中有一个不可串行化的对象,但又想保存该对象的状态信息该如何是好?在这样情况下可以在这个可串行化的类中实现writeObject()和readObject()。
示例4:
串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内在缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的位数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。
Java有Serialization API为开发者提供了一种标准的机制来串行化类。
2. 为什么要Serilzation?
特别地,串行化主要有三种用途:
1)作为一种持久化机制
如果使用的是FileOutputStream流的方式,则数据将被自动地写入文件中,
2)作为一种复制机制
如果使用的是
ByteArrayOutputStream
流的方式,数据将写入内存中的字节数组中。该字节数组可以用来创建初始对象的副本,3)作为一种通信机制
如果是使用套接字(Socket)流的方式,则数据自动地通过网络连接传输一另一个端点,并由这个端点上的程序来决定做什么。
3. Serialization的基本用法:默认机制
将要串行化的类必须实现java.io.Serializable接口,或者是继承实现了该接口的类。然后通过java.io.ObjectOutputStream类来实现持久化,如果用保存到文件上还需要用到java.io.FileOutputStream类。因为ObjectOutputStream被认为是java.io包中的高级类所以可用它来包装低级的类FileOutputStream。在持久化过程中调用的一个方法是ObjectOutputStream对象的writeObject(obj)方法。
当要从文件中恢复对象时,则是使用java.io.OjbectInputStream与FileInputStream类,调用一方法是ObjectInputStream对象的readObject()方法。
示例1:
import java.io.*;
public class Cat implements Serializable {
private String name;
public Cat () {
this.name = "new cat";
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
import java.io.*;
public class CatDemo {
public static void main(String[] args) {
Cat cat = new Cat();
try { //串行化
FileOutputStream fos = new FileOutputStream("catDemo.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(" 1> " + cat.getName());
cat.setName("My Cat");
oos.writeObject(cat);
oos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
try { //反串行化
FileInputStream fis = new FileInputStream("catDemo.out");
ObjectInputStream ois = new ObjectInputStream(fis);
cat = (Cat) ois.readObject();
System.out.println(" 2> " + cat.getName());
ois.close();
} catch (IOException ex) {
ex.printStackTrace();
}
catch(ClassNotFoundException ex) {
ex.printStackTrace();
}
}
}
4. Serialization常见问题
正如前面提到的,所有可串行化的类必须直接或是通过继承方式间接地实现java.io.Serializable接口,由于Object类关没有实现这个接口,所以并不是所有类的对象都是可串行化的。像AWT与Swing的GUI组件、字符串、数组等都是可串行化的,而像一些系统级的类(Thread
,OutputStream
等)和Socket类是不可串行化的。问题一:如果在一个可串行化的类中Has-As不可串行化的类该怎么处理?
在这种情况下在运行时会抛出NotSerializableException。
为了解决类似问题,Java中提供了transient关键字来跳过对不可串行化类的对象的处理。但这依然可能会引起一些问题,在反串行化时,被标识为transient变量不会恢复到其原始状态,而是提供默认值,如示例2中的pig引用将赋值为null,age变量赋值为0;
附:基本类型和引用类型的默认值
对象引用:null
byte, short, int, long :0
float, double:0.0
boolean:false
char:'\u0000'(这是Unicode字符集的空格)
示例2:
import java.io.*;
public class NewPig2 implements Serializable {
private String newName;
private transient Pig pig = new Pig();
private transient int age = 2;
public NewPig2() {
newName = "new Pig 2";
//pig = new Pig();
}
public Pig getPig() {
return this.pig;
}
public void setName(String name) {
this.newName = name;
}
public String getName() {
return this.newName;
}
public int getAge() {
return this.age;
}
}
问题二:如果父类不可串行化,子类实现了Serializable会怎样?
如果有一个Animal类是不可串行化的,而有一个Dog类继承自Animal类并且实现了Serializabl接口,则没有串行化时没有任何问题,但是在反串行化时将会重新调用Animal的构造函数,如示例3所示。
示例3的运行结果如下:
1> No Color - new Dog
2> Green - My Dog
4> No Color - My Dog
因为Animal不可串行化,所以必须运行构造函数,但不会在实现Serializable的反串行化类上运行构造函数。
示例3:
public class Animal {
private String color;
public Animal () {
this.color = "No Color";
}
public void setColor(String color) {
this.color = color;
}
public String getColor () {
return this.color;
}
}
import java.io.*;
public class Dog extends Animal implements Serializable {
private String name;
public Dog () {
this.name = "new Dog";
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
import java.io.*;
public class DogTest {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(" 1> " + dog.getColor() + " - " + dog.getName());
dog.setColor("Green");
dog.setName("My Dog");
System.out.println(" 2> " + dog.getColor() + " - " + dog.getName());
try {//串行化
FileOutputStream fos = new FileOutputStream("myDog.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dog);
oos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
try {//反串行化
FileInputStream fis = new FileInputStream("myDog.out");
ObjectInputStream ois = new ObjectInputStream(fis);
dog = (Dog) ois.readObject();
System.out.println(" 4> " + dog.getColor() + " - " + dog.getName());
ois.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
5.
自定义默认方法:使用writeOject和readObject假如在一个可以串行化的类中有一个不可串行化的对象,但又想保存该对象的状态信息该如何是好?在这样情况下可以在这个可串行化的类中实现writeObject()和readObject()。
示例4:
import java.io.*; import java.util.Scanner; public class NewPig3 implements Serializable { private String newName; private transient Pig pig = new Pig(); private transient int age = 2; public NewPig3() { newName = "new Pig 3"; //pig = new Pig(); } private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); oos.writeChars(pig.getName()); //oos.writeInt(this.age); } private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { ois.defaultReadObject(); pig = new Pig(); Scanner in = new Scanner(ois); if (in.hasNextLine()) { pig.setName(in.nextLine()); } } public Pig getPig() { return this.pig; } public void setName(String name) { this.newName = name; } public String getName() { return this.newName; } public int getAge() { return this.age; } }
发表评论
-
排序的种类及java实现
2012-02-08 17:09 0排序的种类有冒泡排序,选择排序,插入排序,稀尔排序,快速排序, ... -
JAVA的public,private,protected访问权限
2012-02-08 16:33 2874Java中的访问权限有public,priva ... -
TOMCAT内存溢出 - 解决
2009-09-21 16:02 2409Tomcat默认可以使用的内 ... -
Servlet API 中文版
2009-08-10 17:02 1665基本类和接口 一、javax.servlet.Servl ... -
struts2 异常处理
2009-06-05 22:55 1358关键字: struts 2 在学习struts2的过程中,想 ... -
struts2的配置文件
2009-06-05 22:50 1668类型struts2共有4类配置文件, struts. ... -
velocity学习总结
2009-05-14 23:18 34241)嵌套vm,在vm中可使 ... -
《Velocity java开发指南》中文版(三)
2009-05-12 22:08 212611.Configuring the Log System(日 ... -
《Velocity java开发指南》中文版(二)
2009-05-12 22:04 26226.Using Velocity In Servlets 1 ... -
《Velocity java开发指南》中文版(一)
2009-05-12 22:00 2762源文见 http://velocity.apache.org ... -
Subvision SVN 服务端与客户端的安装
2009-04-11 17:44 6958一、准备工作1、获取 Su ... -
Struts:logic:iterate用法详解
2009-03-27 14:57 3525Iterate主要用来处理在页面上输出集合类,集合一般来说是下 ... -
weblogic 8.1.4 hibernate3 异常 org.hibernate.hql.ast
2009-03-27 14:55 1585前几天开始写代码,在weblogic 8.1.4上用hiber ... -
WebLogic设置session超时时间
2009-03-27 14:52 3516WebLogic如何设置session超时时间 1 web.x ... -
Spring的四种声明式事务的配置-Hibernate事务
2009-03-20 17:18 1246以下两个bean的配置是下面要用到的。 Xm ... -
NetBeans 6.5 解决内存溢出
2009-03-18 17:19 20461,修改英文netbeans界面字体大小,修改%Netbea ... -
hibernate集合映射inverse和cascade详解
2009-03-06 10:31 9904. hibernate如何根据pojo来更新数据库4.0 在 ... -
RandomAccessFile类 乱码问题的解决
2008-12-11 11:32 5743//用RandomAccessFile读取出来乱码的解决 St ... -
java中一些常用转义字符
2008-12-10 14:37 2309转义序列 标准形式 功能描述 \n NL ... -
在JAVA文件中获取该项目的相对路径
2008-11-08 19:28 17531.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或 ...
相关推荐
该项目通过使用定制的序列化代码的运行时生成,提出了一种更快的 Java 序列化方法。
Experiences Implementing Efficient Java Thread Serialization, Mobility and Persistence
Item 85: Prefer alternatives to Java serialization Item 86: Implement Serializable with great caution Item 87: Consider using a custom serialized form Item 88: Write readObject methods defensively ...
详细讲解了java各种输入输出流(stream),以及serialization和externalization的用法与关系
Java Serialization, java Tutorial
本篇文章是对Java中对象的序列化(Serialization) 机制进行了详细的分析介绍,并附实例,需要的朋友可以参考下
Fast, efficient Java serialization java序列化jar包
探讨和比较Java和.NET的序列化(Serialization)框架
Java中对象的序列化(serialization)允许把采用Serializable接口的任何对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。其机制不依赖于操作系统,也就是说,你可以通过网络传递该对象,并在网络...
Java的序列化通过整数拆分加倍 通常需要存储以非二进制格式计算得出的浮点数而又不丢失信息,例如存储在(JSON)文本文件中。 Java 提供了一种使用获取double 值的精确表示的。 Java还可以使用将生成的十六进制字符...
z Java I/O 流(character Stream, byte Stream, serialization) z Java Collections Framework z Java GUI(awt, swing, layoutManger, eventhandling….) z 共32学时,上机两次(每次4小时) 3 第一讲JAVA 概述 1. ...
kotlinx-serialization-compiler-plugin.jar
序列化是指将结构化对象转化为字节流以便在网络上传输或者写到磁盘永久存储的过程。下面通过本文给大家分享Java Object Serialization与 Hadoop 序列化,需要的朋友可以参考下
Networking Override Mechanism Security Serialization Extension Mechanism XML JAXP lang and util Base Libraries lang and util Collections Concurrency Utilities JAR Logging Management Preferences ...
java运行依赖jar包
java运行依赖jar包
1.Java中的泛型方法和通配符(wildcards) 2.Java中的集合框架(Collections类和数据结构) 3.Java中的自动装箱和拆箱(Autoboxing ...13.Java中的序列化(Serialization) 14.Java中的多线程编程(Multi-threading)
streams, functional interfaces, object serialization, concurrency, generics, generic collections, database with JDBC™ and JPA, and compelling new Java 9 features, such as the Java Platform Module ...