Java
的对象序列化将那些实现了Serializable
接口的对象转换成一个字节序列,
并能够在以后将这个字节序列完全恢复为原来的对象.
这一过程可以在网络进行,
这意味着序列化机制能自动弥补不同操作系统之间的差异.
对象序列化的概念是RMI,EJB
等技术的基础.
很多标准类库都实现了序列化机制,
包括所有的基础数据类型的封装器,
所有容器类以及很多其他的东西.
甚至Class
对象也可以被序列化.
序列化与反序列化的方法:
要序列化一个对象A,
首先要创建ObjectInputStream
对象,
然后writeObject
对象A,
恢复对象A
的时候创建ObjectOutputStream
对象,
然后readObject
得到对象A.
对Serializable
对象来说,
对象完全以它存储的二进制位为基础来构造,
而不是调用构造器.
而对于一个Externalizable
对象,
恢复对象的时候,
所有普通的默认构造器都会被调用,
然后再调用readExternal().
Externalizable
接口:
实例:
该接口中有两个方法,
在序列化与反序列化的时候使用,
而不是调用ObjectInputStream
与ObjectOutputStream
中的方法.
清单1: User
import
java.io.Externalizable;
import
java.io.IOException;
import
java.io.ObjectInput;
import
java.io.ObjectOutput;
public
class
User
implements
Externalizable
{
private
static
final
long
serialVersionUID
= 1L;
private
int
id
;
private
String
name
;
private
String
password
;
public
User()
{
System.
out
.println(
"
默认构造方法"
);
}
public
User(
int
id, String name, String password)
{
this
.
id
= id;
this
.
name
= name;
this
.
password
= password;
System.
out
.println(
"
有参构造方法"
);
}
public
int
getId()
{
return
id
;
}
public
void
setId(
int
id)
{
this
.
id
= id;
}
public
String getName()
{
return
name
;
}
public
void
setName(String name)
{
this
.
name
= name;
}
public
String getPassword()
{
return
password
;
}
public
void
setPassword(String password)
{
this
.
password
= password;
}
public
void
readExternal(ObjectInput objectInput)
throws
IOException,
ClassNotFoundException
{
System.
out
.println(
"
读"
);
id
= (Integer) objectInput.readObject();
name
= (String)objectInput.readObject();
password
= (String)objectInput.readObject();
}
public
void
writeExternal(ObjectOutput
objectOutput)
throws
IOException
{
System.
out
.println(
"
写"
);
System.
out
.println(
id
);
objectOutput.writeObject(
id
);
objectOutput.writeObject(
name
);
objectOutput.writeObject(
password
);
}
}
要序列化的对象一定要确保自己的父类能够建立成功,
即父类有无参构造方法.
Transient
关键字
对于一个serializable
来说,
如果不想让某个字段进行序列化的话,
则对该字段加上Transient,
则该字段不会序列化.
由于Externalizable
对象在默认情况下不保存他们的任何字段,
所以Transient
关键字只能和Serializable
对象一起使用.
Externalizable
的替代方法(
最好的方法)
在实现serializable
接口的对象中,
添加writeObject()
与readObject()
方法.
这样一旦对象被序列化或者反序列化还原,
就会自动的分别调用这两个方法,
只要提供这两个方法,
就会使用他们而不是默认的序列化机制.
这些方法必须有准确的方法特征签名:
private
void
readObject(ObjectInputStream objectInput)
throws
IOException,
ClassNotFoundException
{
objectInput.defaultReadObject();
}
private
void
writeObject(ObjectOutputStream
objectOutput)
throws
IOException
{
objectOutput.defaultWriteObject();
}
在调用ObjectOutputStream.writeObject(),
会检查所传递的Serializable
对象,
看看是否实现了自己的writeObject(),
如果是这样,
就跳过正常的序列化过程并调用它的witeObject
在自己的writeObject(),
我们可以调用defaultWriteObject
方法来执行默认的witeObject(),
就是执行序列化机制.
分享到:
相关推荐
Java序列化机制是Java平台提供的一种标准方法,用于将对象的状态转换为字节序列,以便在网络中传输或存储在磁盘、数据库等持久化介质中。这一机制在分布式环境、远程通信、持久化存储和数据交换等多个场景下具有广泛...
Java序列化机制就是为了满足这种需求而产生的。通过序列化,我们可以将对象转换为字节流,从而使得对象可以通过网络传输或者持久化存储。 #### 三、实现序列化的步骤 1. **实现Serializable接口**:为了使一个对象...
首先,我们需要创建一个实现了`Serializable`接口的类`TestSerial`,这样Java序列化机制才能处理这个类的对象。 接下来,我们编写代码将对象序列化并输出为字节流,存储在一个临时文件`temp.out`中。 ```java ...
在给定的链接"Java序列化机制(2)- serialVersionUID 实验"中,博主通过一个实验详细解释了`serialVersionUID`的作用和重要性。实验可能包括以下步骤: 1. 创建一个实现`Serializable`接口的简单类,并运行序列化...
Java 序列化机制 Java 序列化机制是一种将对象状态写入 Byte 流里的技术,并可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象持久化到...
序列化ID,即`serialVersionUID`,是Java序列化机制中一个关键的概念。它是一个类的唯一标识符,用于在序列化和反序列化过程中确定类的版本一致性。如果序列化对象和反序列化对象的`serialVersionUID`不匹配,将会抛...
通过实例深入了解 Java 序列化,可以帮助开发人员更好地理解 Java 序列化机制,避免一些常见的问题,提高开发效率。本文通过分析一些真实情境,帮助读者轻松牢记 Java 序列化中的一些高级认识。
Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在 Java 中,序列化和反序列化是...
Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复...理解和熟练掌握序列化机制,以及知道如何避免其潜在问题,对于任何Java开发者来说都是至关重要的。
1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...
Java 序列化机制是通过实现 java.io.Serializable 接口来实现的。该接口没有任何方法,但它标志着该类的对象可以被序列化。如果一个类实现了 Serializable 接口,那么该类的所有属性必须是可序列化的。如果有一个...
通过实例了解java序列化机制 知识点1: 序列化机制的定义 Java 序列化机制是指对象通过写出描述自己状态的数值来记录自己的过程,即将对象表示成一系列有序字节。序列化机制主要用于对象的存储和传输。 知识点2: ...
Protocol Buffer(简称PB)是Google开发的一种高效的数据序列化协议,而Java序列化是Java平台内置的一种序列化机制。两者的主要目标都是将对象转化为字节数组,便于在网络传输、持久化存储等场景中使用。然而,它们...
- Java序列化是Java平台提供的一种持久化机制,它允许将对象转换为字节序列,这样就可以保存在文件中或在网络上传输。 - 序列化不仅可以用来持久化数据,还可以用于进程间通信(IPC)和远程方法调用(RMI)。 2. ...
Java序列化机制的优点在于它提供了一种标准的方式来处理对象的持久化和在网络间的传输。然而,序列化也存在安全风险,比如序列化可能导致远程代码执行攻击。因此,对于敏感信息或复杂对象结构,应谨慎使用序列化,并...
以下是关于Java序列化机制和原理的详细解释: 1. **序列化接口**: Java中的序列化是通过实现`Serializable`接口来实现的。这个接口没有任何方法,它的存在仅仅是为了标记一个类可以被序列化。如以下示例所示: `...
Java 序列化机制 Java 序列化是将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到...
Java序列化是Java平台提供的一种持久化机制,它允许我们将一个Java对象转换为字节流,以便存储到磁盘上,或者通过网络进行传输。这使得我们可以保存和恢复对象的状态。实现序列化的类需要实现`Serializable`接口,...
- **重要性**:Java序列化机制依赖于`serialVersionUID`字段来验证序列化版本的一致性。 - **默认生成**:当类首次序列化时,JVM会根据类的结构自动生成一个`serialVersionUID`。 - **手动指定**:为了确保反序列...