gpt4 book ai didi

java - 序列化对象丢失数据

转载 作者:行者123 更新时间:2023-11-29 04:37:46 25 4
gpt4 key购买 nike

我创建了一个通过 RMI 进行通信的 Java 服务器和客户端应用程序。为了让客户端“满足”服务器,我向客户端发送了一个多播数据报包。发生的事情是我用属性 localDirectory 实例化类,当我收到它时,它有空值。重要的是要说我尝试发送的对象实现了 Seriaizable。

你认为我做错了什么?

(如果您需要其他代码,请告诉我)

public static void main(String[] args) throws RemoteException {




localDirectory = new File("c:\\tempfiles".trim());

serverToTransmit = (ServerInterface) new Server(localDirectory);


if (!localDirectory.exists()) {
System.out.println("Directory " + localDirectory + " does NOT exist!");
return;
}

if (!localDirectory.isDirectory()) {
System.out.println("The path " + localDirectory + " is NOT a directory!");
return;
}

if (!localDirectory.canRead()) {
System.out.println("WITHOUT reading permissions on " + localDirectory + "!");
return;
}

try {
System.out.println("Vou criar o registry");
Registry registry;

try {

System.out.println("Registry lauching try in port " + 7609 + "...");

registry = LocateRegistry.createRegistry(7609);

System.out.println("Registry launched!");
} catch (RemoteException e) {

System.out.println("Registry probably in execution already!");
registry = LocateRegistry.getRegistry();
}

System.out.println("Será que criei?");

//Create Service
//ServerInterface service = new Server(localDirectory);
Server server = new Server(localDirectory);

registry.bind(SERVICE_NAME, server);

System.out.println("Service " + SERVICE_NAME + " registered on registry.");


MulticastSocket sock = new MulticastSocket(7000); //225.15.15.15 e o porto 7000.
InetAddress addr = InetAddress.getByName("225.15.15.15");
sock.joinGroup(addr);
//sock.setTimeToLive(1);
DatagramSocket psock;
while (true) {

try {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(serverToTransmit);
//out.writeUnshared(objectToTransmit) in order to avoid caching issues
out.flush();
byte[] data = bOut.toByteArray();
DatagramPacket packet = new DatagramPacket(data, data.length, addr, 7000);
System.out.println("sizeeee: " + bOut.size());
sleep(3000);
sock.send(packet);
} catch (SocketException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}

}

/* if (args.length > 0 && args[0].equals("leader")) {
playLeader(sock, psock, addr);
} else {
playFollower(sock, psock, addr);
}
sock.leaveGroup(addr);*/
} catch (RemoteException e) {

System.out.println("Remote error - " + e);
System.exit(1);
} catch (Exception e) {

e.printStackTrace();
}

我在客户端收到它是这样的(只放重要的代码):

MulticastSocket sock = new MulticastSocket(7000);   //225.15.15.15 e o porto 7000.
InetAddress addr = InetAddress.getByName("225.15.15.15");
sock.joinGroup(addr);

sock.setTimeToLive(1);

System.out.println("PASSOU AQUI_!");
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024, addr, 7000);
sock.receive(packet);
System.out.println("PASSOU AQUI_1!");
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(packet.getData(), 0,
packet.getLength()));
System.out.println("PASSOU AQUI_2!");
ServerInterface returnedObject = (ServerInterface) in.readObject();
System.out.println("Returned Object LOCAL DIR -> " + returnedObject.getLocalDirectory());

谢谢!

最佳答案

因此,为了涵盖所有可能性,包括一些被您的问题排除的可能性,属性 localDirectory 要么:

  • 序列化时为空
  • 静态的
  • 短暂的
  • 不是由自定义writeObject() 方法编写的
  • 不是由自定义 readObject() 方法分配的
  • 甚至没有出现在被序列化的类版本中,但出现在被反序列化的版本中
  • writeReplace()/readResolve() megillah 的某个地方丢失了。

关于java - 序列化对象丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40539760/

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