gpt4 book ai didi

Android:使用 ObjectOutputstream 和 ObjectInputstream 未正确接收对象

转载 作者:行者123 更新时间:2023-11-30 03:05:36 24 4
gpt4 key购买 nike

情况:客户端使用 ObjectOutputStream 将对象发送到服务器。发送后我 flush() 和 reset()。

服务器接收到对象,做一些处理并发回给客户端。发送后,我立即调用 ObjectOutputStream.reset()。 在发送之前,我还在控制台中打印了这个对象中的一个字段。

客户端使用 ObjectInputStream() 从服务器接收相同的对象。

问题:在客户端收到返回的对象后,在服务器控制台打印正常的字段现在打印 NULL。

我试过的 :我在两端发送和接收后使用 flush() 和 reset() 。

为什么接收到的对象损坏了?

客户端代码——Thread的run():

                objectOutputStream.flush();
objectOutputStream.reset();

//out.println("#SerialO#");
objectOutputStream.writeBoolean(true);


if(((Dodger) this.obj).getRemotable()){

Log.i("ENDPOINT", "Sending Serialized ObjecInstance ...");
objectOutputStream.writeObject(this.obj);
objectOutputStream.flush();
objectOutputStream.reset();
}

客户端代码--调用函数接收服务器的O/P

        objectOutputStream.writeBoolean(false);

objectOutputStream.flush();
objectOutputStream.reset();
objectOutputStream.writeObject(args);

objectOutputStream.flush();
objectOutputStream.reset();

res = objectInputStream.readObject();

......
else if (res instanceof Dodger)
{
res = (Dodger) res;
res3 = (Dodger)res;
Log.v("CLIENT", "Object received Dodger "+ctr);
}
else
if(res==null)
Log.v("CLIENT", "Object received is NULL "+ctr);
else
Log.v("CLIENT", "Object received of UNKNOWN Type "+ctr);

catch (Exception e)
{
Log.e("CLIENT receive error 3",e.toString());
}

// ** ERROR COMES AT THIS LINE. NULL VALUE IS PRINTED **
System.out.println("ENDPOINT GETPOSITION -> "+res3.getPosition());

服务器代码 - 主线程。

flg = mInput.readBoolean();//this.input.readLine().toString();

System.out.println("SERVER Received flg as "+flg);

if(flg){

Log.d("SERVER","Received an object");
sendObj = mInput.readObject();
//mOutput.flush();
CommunicationThread commThread = new CommunicationThread(this.clientSocket,it,sendObj);
new Thread(commThread).start();
}
else //if(flg.equalsIgnoreCase("P"))
{
Object[] recArgs = (Object[])mInput.readObject();

executor = Executors.newFixedThreadPool(1);
executor.submit(new updateUIThread(this.clientSocket, this.msg, recArgs));

//Temp
//executor.execute(new updateUIThread(this.clientSocket, this.msg, recArgs));
//break;
}

服务器代码 - 通信线程:

            if (mInput==null){
Log.i("SERVER","Receiving very first serialized obj");
mOutput = new ObjectOutputStream(this.clientSocket.getOutputStream());
System.out.println("Inside Server's Comm Thread 2 ");
mInput = new ObjectInputStream(new BufferedInputStream(this.clientSocket.getInputStream()));
}
{

System.out.println("Inside Server's Comm Thread 3 ");

if (obj instanceof Dodger) {
obj1 = (Dodger)obj;
//...

System.out.println("Dodger Object Type: " + obj.getClass().getName());

}
else {
System.out.println("Unexpected object type: " + obj.getClass().getName());
}

服务器代码 - updateUIThread:

    obj1.setPosition((Vec2)this.recArgs[0]);

// BELOW IT PRINTS THE PROPER VALUE, BEFORE SENDING BACK TO CLIENT
System.out.println("SERVER GETPOSITION "+obj1.getPosition());

mOutput.reset();
mOutput.writeObject(obj1);
mOutput.reset();

最佳答案

解决了。事实证明,从 getPosition() 返回的变量来自未实现可序列化的父类(super class)。这就是为什么即使对象正确返回,对象内部的特定变量“在传输过程中丢失”的原因。

这个故事的寓意:每当你创建一个类 Serializable 时,它​​的所有父类(super class)也必须实现 Serializable !!

关于Android:使用 ObjectOutputstream 和 ObjectInputstream 未正确接收对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21876330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com