什么情况下需要序列化
a)当你想把的内存中的对象写入到硬盘的时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
再稍微解释一下:
a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,
硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,
它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,
如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。
没有人说的话能全部准确,批判性的参考。
Java Serializable序列化Socket传送例子:
1. 实现Serializable的Object
package com.qdl.test;
import java.io.Serializable;
public class TestObject implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. 建立一个server用来接收object
package com.qdl.test;
import java.net.ServerSocket;
import java.net.Socket;
public class SendServer extends java.lang.Thread {
private boolean OutServer = false;
private ServerSocket server;
private final int ServerPort = 8765;
public SendServer() {
try {
server = new ServerSocket(ServerPort);
System.out.println("The server is running...");
} catch (java.io.IOException e) {
System.out.println("Socket start-up error!");
System.out.println("IOException :" + e.toString());
}
}
public void run() {
Socket socket;
java.io.ObjectInputStream in;
while (!OutServer) {
socket = null;
try {
synchronized (server) {
socket = server.accept();
}
System.out.println("Built a connection: InetAddress = "
+ socket.getInetAddress());
socket.setSoTimeout(15000);
in = new java.io.ObjectInputStream(socket.getInputStream());
TestObject data = (TestObject) in.readObject();
System.out.println("The value received:" + data.getName());
in.close();
in = null;
socket.close();
} catch (java.io.IOException e) {
System.out.println("Socket connection error!");
System.out.println("IOException :" + e.toString());
} catch (java.lang.ClassNotFoundException e) {
System.out.println("ClassNotFoundException :" + e.toString());
}
}
}
public static void main(String args[]) {
(new SendServer()).start();
}
}
3. 创建一个client测试一下
package com.qdl.test;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
public class SendClient {
private String address = "127.0.0.1";
private int port = 8765;
public SendClient() {
// Prepare the data need to transmit
TestObject data = new TestObject();
data.setName("Scott");
Socket client = new Socket();
InetSocketAddress isa = new InetSocketAddress(this.address, this.port);
try {
client.connect(isa, 10000);
ObjectOutputStream out = new ObjectOutputStream(
client.getOutputStream());
// send object
out.writeObject(data);
out.flush();
out.close();
out = null;
data = null;
client.close();
client = null;
} catch (java.io.IOException e) {
System.out.println("Socket connection error!");
System.out.println("IOException :" + e.toString());
}
}
public static void main(String args[]) {
new SendClient();
}
}