Java序列化Serializable

一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。
因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,
它的目的只是简单的标识一个类的对象可以被序列化。

什么情况下需要序列化 
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();  } }

你可能感兴趣的:(Serializable,反序列化,序列化)