串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象,
打回原形。
一、串行化的意义:
1:解决Web应用程序的无状态弊端
一旦将某一对象串行化,得到的字节可以存储在文件、数据库,或内存中—— 只要是可以存储的任何地方。需要恢复对象时,仅仅只需从它存储的位置反串行化即可。对象固有的这种特性对于无状态的Web应用程序是非常重要的,因为它允许重要的状态信息可以在用户请求之间保留。
2:应用程序边界之间传递对象
串行化也允许对象在应用程序边界之间传递,编程人员可以将描述对象状态的字节流在网络上传递,并在另一端反串行化成一个匹配的对象。从本质上讲,串行化允许对象以“数值”的方式传递给另一个应用程序。
二:串行化对象
在java中串行化对象必须:
1、该对象的类必须实现Serializable接口
2、该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。而对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明 。
注:保存任何的成员方法和静态的成员变量没有任何的意义,因为,对象的类已经完整的保存了他们,如果再串行化他们还有什么意义呢?呵呵
3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
三:具体实现
1、
串行化的对象:Person类
import java.io.Serializable;
/*
* time:2008-07-19
* author:coke
*/
/*
*必须实现Serializable
*/
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private int age; // will persist
private String name; // will persist
// transient 为Java保留字,告诉JVM以transient宣告的基本型态(primitive type)或物
// 件(object)变量不要序列化,例如敏感性数据像是密码等。
private transient String pwd; // will not persist
public Person() {
}
public Person(int age, String name,String pwd) {
this.age = age;
this.name = name;
this.pwd=pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
2、
串行化和反串行化
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
/*
* time:2008-07-19
* author:coke
*/
public class TestSerializable {
private static File f = null;
//串行化
public static void serialization() {
f = new File("D://t.m");
try {
if (f.exists())
f.delete();
f.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Person p = new Person(10, "xplq", "123456");
try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(f));
out.writeObject(p);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//反串行化
public static void deserialization() {
if (!f.exists())
return;
try {
ObjectInputStream input = new ObjectInputStream(
new FileInputStream(f.getPath()));
try {
Person p = (Person) input.readObject();
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getPwd());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//测试
public static void main(String[] args) {
TestSerializable.serialization();
TestSerializable.deserialization();
}
}
3.测试结果
xplq
10
null
因为pwd transient ,不能被串行化
分享到:
相关推荐
总结来说,通过C++/CLI进行串行化和反串行化是一个强大的功能,它允许开发者在.NET环境中将C++对象持久化存储,并在需要时重新加载这些对象。掌握C++/CLI中的串行化技术,对于需要在.NET平台上进行复杂数据操作的C++...
3. **readObject()和writeObject()**:对于复杂的对象,可以重写`writeObject()`和`readObject()`方法来自定义串行化和反串行化的行为。这些方法允许你精确地控制哪些数据应该被保存和恢复。 4. **Externalizable...
串行化(Serialization)是将对象的状态转换为字节流的过程,以便于存储或在网络上传输。Java提供了强大的串行化机制,允许程序员将任何实现了`Serializable`接口的对象转化为字节流,并将其写入文件或其他输出流中...
C#中如果需要:将一个结构很复杂的类的对象存储起来,或者通过网路传输到远程的客户端程序中去,这时就需要用到序列化,反序列化(Serialization & Deserialization) 2.BinaryFormattter .NET中串行有三种,...
功能规范部分会涉及VbyOne HS接口的核心功能,例如数据的打包和解包(Packer and Unpacker)、数据的扰乱和解扰乱(Scrambler and Descrambler)、数据的编码和解码(Encoder and Decoder)、数据的串行化和反串行化...