Это код, который я написал для передачи объекта pm (класса PM), который содержит любые объекты vm (класса VM) через сокеты.
public class PM implements Serializable{
private static final long serialVersionUID=1L;
VM vm[]=new VM[10];
//IP of the Agent
String IP;
public PM() {
super();
for(int i=0;i<10;i++){
vm[i]=new VM();}
}
}
VM - это другой класс, который имеет свои атрибуты.
public class VM implements Serializable{
String osType;
}
Обмен объекта pm через сокеты происходит между двумя компьютерами. Серверная сторона получает объект со стороны клиента после того, как сервер выполнил обнаружение сети (отсюда и имена классов).
public class NetworkDiscovery extends TimerTask {
InetAddress controllerIP;
int controllerPort;
static PM pm = new PM();
NetworkDiscovery() throws UnknownHostException {
controllerIP=InetAddress.getLocalHost();
controllerPort=4455;
}
public void run() {
try {
byte[] recvBuf = new byte[5000];
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
DatagramSocket dSock = new DatagramSocket(4445);
dSock.receive(packet);
int byteCount = packet.getLength();
ByteArrayInputStream byteStream = new ByteArrayInputStream(recvBuf);
ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream));
pm=(PM)is.readObject();
System.out.println("object1" +pm.IP);
is.close();
dSock.close();
System.out.println("object" + pm.vm[0].vmName);
} //exceptions are caught etc.
}
}
и на стороне клиента, которая отправляет объект pm на сервер:
public class ackDiscovery extends TimerTask{
int agentListenPort;
InetAddress agentIP;
ackDiscovery(Connect c) {
agentListenPort=4445;
c1=c;
}
public void run() {
ObjectOutputStream os = null;
try {
PM pm = new PM();
{
pm.IP = InetAddress.getLocalHost().toString();
pm.vm[i].osType = d1.getOSType();
System.out.println("VMname" +i +pm.vm[i].osType);
pm.vm[i].status = d1.isActive();
}
InetAddress address = InetAddress.getByName("Server_IP");
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(15000);
os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
os.flush();
os.writeObject((PM) pm);
os.flush();
byte[] sendBuf = byteStream.toByteArray();
DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, address, 4445);
int byteCount = packet.getLength();
DatagramSocket dSock = new DatagramSocket();
System.out.println("Quote of the Moment: " + pm.vm[0].osType);
dSock.send(packet);
os.close();
dSock.close();
} //exceptions caught etc.
}
}
Все детали vm и pm заполняются на стороне клиента (я проверил это, напечатав их). на стороне сервера ТОЛЬКО данные pm заполняются на локальном объекте pm после передачи. отображение подробностей vm на стороне сервера дает мне нулевые значения.
Мои сомнения:
- Разве передача объекта, у которого также есть дочерние объекты, не означает, что передаются все родительские + дочерние объекты?
- Нужно ли вручную переносить объекты vm и pm по отдельности?
Редактировать-
public class VM implements Serializable{
String osType,vmName; //on server's side, these are still null
int UUID,osVersion; // on the server's side, these are 0. Are integer variables initialised to a default of zero?
}