簡體   English   中英

從同一流發送序列化的對象和byte []

[英]Sending serialized objects and byte[] from same stream

我有一個客戶端服務器應用程序,它們通過objectoutputstream和objectinputstream進行通信。 我將序列化的對象從一個對象發送到另一個對象,但是現在我也想發送文件。 如果我在序列化對象內部傳遞文件的byte [],則可以傳輸該對象,但是對象停留在objectoutputstream和objectinputstream上,如果文件足夠大,則在發送一些消息后,我會得到內存異常。 如果我像這樣發送:

File file = new File("C:\\a.txt");
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] buffer = new byte[1024*1024*10];
int n = -1;
while((n = bis.read(buffer))!=-1) {
    oos.write(buffer,0,n);
}

並閱讀:

while ((fromServer = ois.read()) != null) {

}

效果很好。

我的問題是,我是否必須實施一個系統來知道是否必須要writeObject / readObject還是只需要寫/讀? 我是否必須擺脫串行通信,是否必須創建另一個用於讀取和寫入的流?

您必須定義一個沒有歧義的協議,並在客戶端和服務器上堅持使用該協議。

例如,如果先發送一個字節流,然后再發送一個對象,則在接收端,您將無法知道字節流何時結束以及對象何時開始。

解決此問題的協議可能是:

  • 發送一個int(4個字節),它是文件的大小N
  • 發送N個字節
  • 發送對象

然后,接收方可以讀取大小(N),然后從流中讀取N個字節,然后讀取對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM