在RMI分布式应用系统中,服务器与客户机之间传递的Java对象必须是可序列化的对象。不可序列化的对象不能在对象流中进行传递。对象序列化扩展了核心Java输入/输出类,同时也支持对象。对象序列化支持把对象编码以及将通过它们可访问到的对象编码变成字节流;同时,它也支持流中对象图形的互补重构造。序列化用于轻型持久性和借助于套接字或远程方法调用(RMI)进行的通信。序列化中现在包括一个 API(Application Programming Interface,应用程序接口),允许独立于类的域指定对象的序列化数据,并允许使用现有协议将序列化数据域写入流中或从流中读取,以确保与缺省读写机制的兼容性。
为编写应用程序,除多数瞬态应用程序外,都必须具备存储和检索 Java对象的能力。以序列化方式存储和检索对象的关键在于提供重新构造该对象所需的足够对象状态。存储到流的对象可能会支持 Serializable(可序列化)或 Externalizable(可外部化)接口。对于Java对象,序列化形式必须能标识和校验存储其内容的对象所属的 Java类,并且将该内容还原为新的实例。对于可序列化对象,流将提供足够的信息将流的域还原为类的兼容版本。对于可外部化对象,类将全权负责其内容的外部格式。序列化 Java 对象的目的是:提供一种简单但可扩充的机制,以序列化方式维护 Java对象的类型及安全属性;具有支持编组和解编的扩展能力以满足远程对象的需要;具有可扩展性以支持 Java 对象的简单持久性;只有在自定义时,才需对每个类提供序列化自实现;允许对象定义其外部格式。
串行化是java.io包中的一部分,它被用来将对象转换成一串字节。在串行化的过程中,将一个实体转变成一系列表示对象的字节,这些字节可以写入文档以备后用,通过网络连接传输到其他程序,用来对初始对象进行拷贝等等。
如果你需要串行化一个类,那么就必须对这个类执行java.io.Serializable,并且提供一个无争议的构造器。Serializable接口不需要任何方法,因此你的这个类不再需要别的了。
如果你有一个简单的类似bean的类,而这个类仅仅是把原始的、可串行化对象作为属性,那么你就不需要再做别的了。当你需要将对象串行化为一系列字节或由一系列字节串行化而来时,Java可以负责所有的细节。
以下是一个可以供你进行实验的完整串行化例子:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Random;
public class SerializableTipHelper {
private static final String STORE_FILE = "bytes.out";
private static final boolean VERBOSE = true;
public static void main(String[] args) {
if ( args.length != 1 && args.length != 2 ) {
System.out.println("use: SerializableTipHelper (read|write) [numberToWrite]");
return;
}
if ( args[0].equals("write") ) {
try {
write(Integer.parseInt(args[1]));
}
catch (IOException e) {
e.printStackTrace();
}
}
// defaults to read
else {
try {
read();
}
catch (IOException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public static void read() throws IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(STORE_FILE));
int numRead = 0;
Object o = null;
try {
while ( (o = in.readObject()) != null ) {
numRead++ ;
if ( VERBOSE ) {
System.out.println("read" + numRead + ": " + o);
}
}
}
catch (EOFException e) {
// suppress
}
}
public static void write(int num) throws IOException {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(STORE_FILE));
Random rand = new Random(System.currentTimeMillis());
for (int i = 0; i < num; i++ ) {
SerializableTip st = new SerializableTip();
st.setAge(rand.nextInt(1000));
st.setEmployed(rand.nextBoolean());
st.setName("instance-" + i);
Employee e = new Employee();
e.setId(rand.nextInt());
e.setName("employee-" + i);
st.setEmployee(e);
if ( VERBOSE ) {
System.out.println("writing: st");
}
out.writeObject(st);
}
out.close();
}
}
import java.io.*;
public class SerializableTip implements Serializable {
private String name;
private int age;
private boolean employed;
private Employee employee;
private int weight;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int i) {
age = i;
}
public void setName(String string) {
name = string;
}
public boolean isEmployed() {
return employed;
}
public void setEmployed(boolean b) {
employed = b;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public String toString() {
StringBuffer me = new StringBuffer();
me.append("[").append(super.toString())
.append(",name=").append(this.name)
.append(",age=").append(this.age)
.append(",employed=").append(this.employed)
.append(",employee=").append(this.employee)
.append("]");
return me.toString();
}
public int getWeight() {
return weight;
}
public void setWeight(int i) {
weight = i;
}
}
public class Employee implements Serializable {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public java.lang.String getName() {
return name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public String toString() {
StringBuffer me = new StringBuffer();
me.append("[").append(super.toString())
.append(",id=").append(this.id)
.append(",name=").append(this.name)
.append("]");
return me.toString();
}
}
以上是本人做网络笔记为自己提供分析认识的,如需更加详细了解串行化细节,还请网友多参考一些专业资料。本文参考于其他同行对此问题的认识,在此非常感谢!
分享到:
相关推荐
Java 对象串行化编程 Java 对象串行化编程是 Java 语言中的一种重要概念,它允许开发者将 Java 对象转换为字节流,以便在网络上传输或存储在文件中。对象串行化的优点是可以将复杂的对象结构转换为简单的字节流,...
对象串行化是Java平台的一个核心特性,它允许对象的状态被保存并能够在不同的时间点或者在不同的系统间进行传输。 **一、串行化的概念和目的** 1. **串行化概念**: 当一个对象被串行化时,它的实例变量(非静态...
Java序列化是指将一个Java对象的状态转换为字节流,以便于存储或通过网络进行传输的过程。当接收端接收到这些字节流后,可以将其重新转换为原始的对象状态。这个过程对于分布式系统的数据交换非常重要。 #### 二、...
对象序列化 串行化 实现java对象的保存
Java 串行化是Java平台中的一个重要特性,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这在分布式系统、持久化存储以及跨进程通信等场景中非常常见。Java 串行化主要通过实现`java.io....
Java对象的XML串行化是将Java对象转换为XML格式的过程,这在分布式系统和网络通信中非常常见,因为XML是一种普遍接受的数据交换格式。它允许不同平台和语言之间的数据共享,尤其是当需要在网络间传输类的信息时。...
本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ### Java序列化简介 序列化是将对象的状态转换为可以存储或传输的格式的过程。在Java中,通过实现`java.io.Serializable`接口...
Java串行程序并行化执行是提升应用性能的关键技术之一,尤其在大数据处理和多核处理器环境下。通过将原本顺序执行的任务分解为多个子任务,然后并发地执行这些子任务,可以显著提高程序运行效率。CGLIB(Code ...
17. **Java对象串行化**:需要实现`Serializable`接口。 18. **Swing组件**:Swing组件是纯Java实现,不包含本地代码,支持标签、菜单和容器等。 19. **结构化程序设计**:强调自顶向下、逐步求精、模块化和避免...
当你将一个对象写入到流中时(如文件流或网络流),Java的ObjectOutputStream会使用串行化机制将对象的状态转化为字节序列。同样,使用ObjectInputStream可以从流中读取并还原对象。 下面是一些关于Java串行化的...
这是因为 Java 对串行化的对象进行反串行化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成。 2. 在实现串行化的时候,需要注意父类的处理。如果父类没有实现串行化接口,则其...
Java 序列化机制 Java 序列化是将一个对象的状态写入一个 Byte 流里,并且可以从其它...这是因为 Java 对串行化的对象进行反串行化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成。
这可以通过实现定制的协议,如JavaScript与APPLET之间的通信,或者使用Java对象串行化。 6. **安全性与权限**:由于APPLET运行在用户的机器上,因此需要考虑安全问题。现代浏览器对APPLET的支持逐渐减少,部分原因...
3. **配置和使用代理**:将原始的并行任务对象替换为代理对象,调用代理对象的并行方法时,实际上会执行我们添加的拦截逻辑,实现串行化。 博客文章中提到的链接提供了具体的实现细节和代码示例,读者可以通过阅读...
CArchive是MFC(Microsoft Foundation Classes)库中的一个重要类,用于实现对象的串行化,即把对象的状态数据转换为字节流并保存到文件,或者从文件中恢复这些数据。这个过程对于数据持久化、应用程序的状态保存...
Java串行化是Java编程语言中的一个重要概念,用于将对象的状态转换为字节流,以便存储在磁盘上或在网络中传输。这个过程被称为对象的序列化,而将字节流恢复为对象的过程称为反序列化。在Java中,实现串行化的主要...
串行化/序列化:将java对象转换成某种格式(JVM定义的)的字节数组 串行化使用场景: 将对象用户网络间传输或者是本地化储存。 反串行化:将字节数组恢复成java对象。 package com.yongjun.io; import java.io....
Java对象序列化与反序列化是开发中常见的需求,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。Kryo是一款强大的、高效且易于使用的Java序列化库,特别适合对性能有高要求的场景。在本文中,我们将...