我研究了一下Java的源代码 :) ObjectInputStream 构造的的时候,你必须捕获IOException异常的,为什么呢? 因为构造函数会用参数InputStream的readShort()方法读取流的头(streameader)信息,Magic number & Version ;试想:如果用socket.getInputStream()作为ObjectInputStream构造函数的参数会出现什么问题?有可能会造成阻塞。 和ObjectInputStream对应,ObjectOutputStream构造函数会写两个short的流的头信息。 假设一个用于传输Object的Socket应用,如果Server和Client,同时声明(objin在前): ObjectInputStream objin = new ObjectInputStream(Sock.getInputStream()); ObjectOutputStream objout = new ObjectOutputStream(Sock.getOutputStream()); 很明显双方都在等待对方输入流的头信息,造成了阻塞。 可以试试下边这段程序便知: import java.io.*; public class test{ public static void main(String args[]){ try{ ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\test.bin"))); System.out.println("out has constrcuted."); ObjectInputStream in = new ObjectInputStream(System.in); System.out.println("in has constrcuted."); } catch(IOException e){ e.printStackTrace(); } } }
运行上面那个程序会阻塞,一直等到你从控制台输入回车,通常会产生java.io.StreamCorruptedException异常,除非你输入的刚好是StreamHeader信息0xac ed 00 05,运行完成程序检查C盘根目录,文件test.bin已经存在,即使你没有调用writeObject方法,而文件的内容是0xac ed 00 05即Streamheader信息。
2、我没用过直接传送object的方法,因为我觉得网络传输有一个很好的跨语言跨平台的优势--我就常常用不同语言写的程序运行在不同的平台上通讯,所以没用过java自己的序列化对象的方法。
ObjectInputStream 构造的的时候,你必须捕获IOException异常的,为什么呢?
因为构造函数会用参数InputStream的readShort()方法读取流的头(streameader)信息,Magic number & Version ;试想:如果用socket.getInputStream()作为ObjectInputStream构造函数的参数会出现什么问题?有可能会造成阻塞。
和ObjectInputStream对应,ObjectOutputStream构造函数会写两个short的流的头信息。
假设一个用于传输Object的Socket应用,如果Server和Client,同时声明(objin在前):
ObjectInputStream objin = new ObjectInputStream(Sock.getInputStream());
ObjectOutputStream objout = new ObjectOutputStream(Sock.getOutputStream());
很明显双方都在等待对方输入流的头信息,造成了阻塞。
可以试试下边这段程序便知:
import java.io.*;
public class test{
public static void main(String args[]){
try{
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\test.bin")));
System.out.println("out has constrcuted.");
ObjectInputStream in = new ObjectInputStream(System.in);
System.out.println("in has constrcuted.");
}
catch(IOException e){
e.printStackTrace();
}
}
}
把他们定义在相同的package中!
我把他们定义在不同的package中,并说明了相同的类。
这样做是因为这是一个C/S系统,最终将分布在不同的两台机器上运行,不可能放在一个package 中吧?