`
toprogrammer
  • 浏览: 65177 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java:序列化(转)

阅读更多
下面和大家分享的是java序列化的一些基础知识,希望能够带给大家帮助。

1 Java 序列化技术概述

Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方

把该Byte 流里的数据读出来。重新构造一个相同的对象。这种机制允许你将对象通过网络

进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的序列化机制是RMI、

EJB、JNNI等技术的技术基础。

1.1 序列化技术基础

并非所有的Java 类都可以序列化,为了使你指定的类可以实现序列化,你必须使该类

实现如下接口:

java.io.Serializable

需要注意的是,该接口什么方法也没有。实现该类只是简单的标记你的类准备支持序列

化功能。我们来看如下的代码:

/**

* 抽象基本类,完成一些基本的定义

*/

public abstract class Humanoid

{

protected int noOfHeads;

private static int totalHeads;

public Humanoid()

{

this(1);

}

public Humanoid(int noOfHeads)

{

如何正确的使用Java序列化技术 技术研究系列

if (noOfHeads > 10)

throw new Error("Be serious. More than 10 heads?!");

this.noOfHeads = noOfHeads;

synchronized (Humanoid.class)

{

totalHeads += noOfHeads;

}

}

public int getHeadCount()

{

return totalHeads;

}

}

该类的一个子类如下:

/**

* Humanoid的实现类,实现了序列化接口

*/

import java.io.*;

public class Person extends Humanoid

implements java.io.Serializable

{

private String lastName;

private String firstName;

private transient Thread workerThread;

private static int population;

public Person(String lastName, String firstName)

{

this.lastName = lastName;

this.firstName = firstName;

synchronized (Person.class)

{

population++;

}

}

public String toString()

{

return "Person " + firstName + " " + lastName;

}

static synchronized public int getPopulation()

{

return population;

}

}

1.2 对象的序列化及反序列化

上面的类Person 类实现了Serializable 接口,因此是可以序列化的。我们如果要把一个

可以序列化的对象序列化到文件里或者数据库里,需要下面的类的支持:

java.io.ObjectOutputStream

如何正确的使用Java序列化技术 技术研究系列

下面的代码负责完成Person类的序列化操作:

/**

* Person的序列化类,通过该类把Person写入文件系统里。

*/

import java.io.*;

public class WriteInstance

{

public static void main(String [] args) throws Exception

{

if (args.length != 1)

{

System.out.println("usage: java WriteInstance file");

System.exit(-1);

}

FileOutputStream fos = new FileOutputStream(args[0]);

ObjectOutputStream oos = new ObjectOutputStream(fos);

Person p = new Person("gaoyanbing", "haiger");

oos.writeObject(p);

}

}

如果我们要序列化的类其实是不能序列化的,则对其进行序列化时会抛出下面的异常:

java.io.NotSerializableException

当我们把Person 序列化到一个文件里以后,如果需要从文件中恢复Person 这个对象,

我们需要借助如下的类:

java.io.ObjectInputStream

从文件里把Person类反序列化的代码实现如下:

/**

* Person的反序列化类,通过该类从文件系统中读出序列化的数据,并构造一个

* Person对象。

*/

import java.io.*;

public class ReadInstance

{

public static void main(String [] args) throws Exception

{

if (args.length != 1)

{

System.out.println("usage: java ReadInstance filename");

System.exit(-1);

}

FileInputStream fis = new FileInputStream(args[0]);

ObjectInputStream ois = new ObjectInputStream(fis);

Object o = ois.readObject();

如何正确的使用Java序列化技术 技术研究系列

System.out.println("read object " + o);

}

}

1.3 序列化对类的处理原则

并不是一个实现了序列化接口的类的所有字段及属性都是可以序列化的。我们分为以下

几个部分来说明:

u 如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可序列化接口。则

其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可序列化接

口,则该类的父类所有的字段属性将不会序列化。

u 如果该类的某个属性标识为static类型的,则该属性不能序列化;

u 如果该类的某个属性采用transient关键字标识,则该属性不能序列化;

需要注意的是,在我们标注一个类可以序列化的时候,其以下属性应该设置为transient

来避免序列化:

u 线程相关的属性;

u 需要访问IO、本地资源、网络资源等的属性;

u 没有实现可序列化接口的属性;(注:如果一个属性没有实现可序列化,而我们又

没有将其用transient 标识, 则在对象序列化的时候, 会抛出

java.io.NotSerializableException 异常)。

1.4 构造函数和序列化

对于父类
分享到:
评论

相关推荐

    java反序列化工具

    Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...

    Java序列化_Java序列化结构_

    Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...

    java序列化和反序列化的方法

    java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在...

    java对象序列化和反序列化

    - 序列化:使用`java.io.ObjectOutputStream`的`writeObject()`方法将对象写入输出流。 - 反序列化:使用`java.io.ObjectInputStream`的`readObject()`方法从输入流读取对象。 4. **优点**: - 数据持久化:将...

    java反序列化利用程序UI版Beta1.1.rar

    1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...

    java serializable 序列化与反序列化

    **一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换为可以存储或传输的数据格式的过程。在Java中,通常是将对象转换为字节数组,以便写入磁盘或通过网络发送。 2. **为什么需要...

    java 对象序列化

    Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储在磁盘上、在网络上传输或在任何其他需要持久化数据的场景中使用。这个过程涉及到两个主要概念:序列化(Marshalling)和反序列化(Unmarshalling)...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    java自动序列化

    Java序列化是将对象转换为字节流的过程,目的是为了保存对象的状态以便稍后恢复或传输到其他地方。通过实现`Serializable`接口,一个Java对象就可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅表示对象...

    Java反序列化工具.zip

    Java反序列化是一种将之前序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方法。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络传输中将对象从一个系统传输到另一个...

    Java 文件 序列化 读写

    Java文件序列化是Java平台中一种重要的数据存储和交换机制,它允许我们将对象的状态转换为字节流,以便可以保存到磁盘、网络传输或在内存中存储,然后在需要时将这些字节流恢复为原来的对象。这个过程称为序列化...

    Java对象序列化和反序列化工具Xson.zip

    Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven:  <groupId>com.github.xsonorg</groupId>  <artifactId>xson-core  <version>1.0.1 ...

    Java对象序列化的秘密

    Java对象序列化是Java平台提供的一种机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络传输或在不同时间点恢复。这个过程涉及到将一个复杂的Java对象模型转换为简单的二进制表示,使得数据可以在不同...

    Protocol Buffer序列化对比Java序列化.

    - Java序列化:Java序列化虽然方便,但生成的数据量较大,且序列化和反序列化速度相对较慢。 2. 数据结构: - Protocol Buffer:PB允许定义自己的数据结构(消息类型),通过.proto文件进行描述,支持基本数据...

    C#和Java的序列化反序列化

    而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...

    FST:快速Java序列化的替代品

    **FST:快速Java序列化的替代方案** 在Java开发中,序列化是一个常见的需求,它允许将对象的状态转换为字节流,以便于存储或网络传输。标准的Java序列化虽然方便,但在处理大量数据时,性能往往成为瓶颈。这时,FST...

    Java序列化

    Java序列化是Java平台中的一种标准机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络进行传输或者在某些时候恢复原来的对象状态。这一过程包括两个主要步骤:对象的序列化(将对象转换为字节流)和反...

    java 序列化代码示例

    Java序列化是Java平台中的一种标准机制,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在Java中,一个类如果要实现序列化,需要实现`Serializable`接口,这是一个标记接口,不包含任何方法。下面我们将...

    Java实现序列化例子

    Java序列化是Java平台提供的一种将对象转换为字节流,以便存储到磁盘、数据库或网络中的机制。它是Java语言内置的一种特性,主要用于持久化数据,也可以在进程间传递对象,或者在网络上传输对象。在Java中,如果一个...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

Global site tag (gtag.js) - Google Analytics