writeUnshared的API:
Writes an "unshared" object to the ObjectOutputStream. This method is identical to writeObject, except that it always writes the given object as a new, unique object in the stream (as opposed to a back-reference pointing to a previously serialized instance). Specifically:
An object written via writeUnshared is always serialized in the same manner as a newly appearing object (an object that has not been written to the stream yet), regardless of whether or not the object has been written previously.
If writeObject is used to write an object that has been previously written with writeUnshared, the previous writeUnshared operation is treated as if it were a write of a separate object. In other words, ObjectOutputStream will never generate back-references to object data written by calls to writeUnshared.
之前是用writeObject,不過(guò)在流中反復(fù)發(fā)送第一次發(fā)送的對(duì)象,調(diào)用hashcode()判斷了是同一對(duì)象,就不再寫這個(gè)對(duì)象到流了。后來(lái)查API看到了writeUnshared()方法
通過(guò) writeUnshared 寫入的對(duì)象總是作為新出現(xiàn)對(duì)象(未曾將對(duì)象寫入流中)被序列化,不管該對(duì)象以前是否已經(jīng)被寫入過(guò)。
但修改過(guò)后,仍未解決~
client
try {
DatagramSocket socket = new DatagramSocket(clientSocketAddr);
DataPacketHeader dph = new DataPacketHeader(true,true,1,12);
DataPacket dp = new DataPacket(dph);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream dos = new ObjectOutputStream(baos);
int count = 0;
for(int i = 0;i<3;i++){
count++;
dph.setAckNum(count);
dos.writeUnshared(dph);//here!!!!!
dos.flush();
byte buf[] = baos.toByteArray();
DatagramPacket dpk = new DatagramPacket(buf,buf.length,serverSocketAddr);
socket.send(dpk);
//dos.close();
}
} catch (SocketException e) {
e.printStackTrace();
}
server
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
DatagramSocket socket = null;
try {
socket = new DatagramSocket(serverSocketAddr);
byte recvBuf[] = new byte[1024 * 100];
DatagramPacket recvDp = new DatagramPacket(recvBuf, recvBuf.length);
DataPacketHeader dataPacket = null;
while (true) {
socket.receive(recvDp);
bais = new ByteArrayInputStream(recvBuf);
ois = new ObjectInputStream(bais);
dataPacket = (DataPacketHeader) ois.readUnshared();//here!!!!!
System.out.println(dataPacket.getAckNum()+"|"+dataPacket.getSeqNum());
}
}catch(xxx){
xxx
}
...
所要序列化的對(duì)象
package main.common;
import java.io.Serializable;
public class DataPacketHeader implements Serializable {
private boolean ACK;
private boolean SYN;
private int ackNum;
private int seqNum;
private int packetLength;
public DataPacketHeader(boolean ACK, boolean SYN, int ackNum, int seqNum) {
this.ACK = ACK;
this.SYN = SYN;
this.ackNum = ackNum;
this.seqNum = seqNum;
//this.packetLength = packetLength;
}
public boolean isACK() {
return ACK;
}
public void setACK(boolean ACK) {
this.ACK = ACK;
}
public boolean isSYN() {
return SYN;
}
public void setSYN(boolean SYN) {
this.SYN = SYN;
}
public int getAckNum() {
return ackNum;
}
public void setAckNum(int ackNum) {
this.ackNum = ackNum;
}
public int getSeqNum() {
return seqNum;
}
public void setSeqNum(int seqNum) {
this.seqNum = seqNum;
}
public int getPacketLength() {
return packetLength;
}
public void setPacketLength(int packetLength) {
this.packetLength = packetLength;
}
}
結(jié)果:
1|12
1|12
1|12
讀取到的是同一對(duì)象
你可以試下打印每次發(fā)送的packet的長(zhǎng)度,可以知道每次發(fā)送的對(duì)象都是逐步增大的,說(shuō)明bytearray中保存的數(shù)組一直在增大,所以,在server端讀的第一個(gè)對(duì)象永遠(yuǎn)是 1|12.
如果你想實(shí)現(xiàn)每次讀出來(lái)不一樣,就只能在for循環(huán)中new ByteArrayOutputStream和 ObjectOutputStream
for (int i = 0; i < 3; i++) {
count++;
dph.setAckNum(count);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream dos = new ObjectOutputStream(baos);
dos.writeUnshared(dph);//here!!!!!
注:
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。