gpt4 book ai didi

java - 如何将对象的 ArrayList(ArrayLists) 转换为字节数组?

转载 作者:行者123 更新时间:2023-11-30 06:49:22 24 4
gpt4 key购买 nike

我目前有一个 java 程序,需要在客户端和服务器之间进行快速通信。在尝试了 TCP 和 RMI 之后,我决定使用 UDP,这对我的目的来说都太慢了。

我有多个ArrayList,存储在一个ArrayList中,然后发送到服务器。这种方法在TCP和RMI中运行良好,但在UDP中需要改为字节。

ArrayList<Object> array = new ArrayList<Object>();
array.add(arrayList1);
array.add(arrayList2);
array.add(arrayList3);
array.add(arrayList4);
array.add(arrayList5);
array.add(arrayList6);

// Convert the ArrayList to bytes, then send to client

添加到正在发送给客户端的 ArrayList 的每个 ArrayList 都包含对象,并且每个 ArrayList 包含不同类型的对象。大多数 ArrayList 包含由我创建的类生成的对象,但我认为没有必要显示它们。

我在互联网上搜索了将 ArrayList 的 ArrayList 转换为字节的答案,但是 .getBytes() 方法对 ArrayList 或其中的对象不起作用。

如果您需要我正在使用的代码的更多示例,请随时询问。上面的代码不是我的真实代码(因为编号 ArrayLists 会非常困惑),但它是我想要实现的目标的准确表示。

谢谢。

最佳答案

要在 UDP 中执行,它将是这样的:

查看服务器:

public static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(obj);
return out.toByteArray();
}
public static Object deserialize(byte[] data) throws IOException, ClassNotFoundException {
ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream is = new ObjectInputStream(in);
return is.readObject();
}
public static void main(String[] args) {
new Server();
byte[] receiveData = new byte[65536];
byte[] sendData = new byte[65536];
try (DatagramSocket datagramSocket = new DatagramSocket(3333);) {
Board.start = true;
while (true) {
try {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
datagramSocket.receive(receivePacket);
ArrayList<Object> object1 = (ArrayList)deserialize(receivePacket.getData());
InetAddress address = receivePacket.getAddress();
int port = receivePacket.getPort();
ArrayList<Object> array = new ArrayList<Object>();
array.add(arrayList1);
array.add(arrayList2);
array.add(arrayList3);
array.add(arrayList4);
array.add(arrayList5);
array.add(arrayList6);
sendData = serialize(array);
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
datagramSocket.send(sendPacket);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}



}

} catch (IOException e) {
e.printStackTrace();
}
}

在客户看来:

public static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(obj);
return out.toByteArray();
}
public static Object deserialize(byte[] data) throws IOException, ClassNotFoundException {
ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream is = new ObjectInputStream(in);
return is.readObject();
}
public static void main(String[] args) {
new Client();
try {
DatagramSocket clientSocket = new DatagramSocket();
byte[] sendData = new byte[65536];
byte[] receiveData = new byte[65536];

while (true) {
try {
ArrayList<Object> fromUser = new ArrayList<Object>();
fromUser.add(arrayList1);
fromUser.add(arrayList2);
sendData = serialize(fromUser);
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, 3333);
clientSocket.send(sendPacket);

DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
ArrayList<Object> object = (ArrayList)deserialize(receivePacket.getData());
arrayList1 = (ArrayList<Object>)object.get(0);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

关于java - 如何将对象的 ArrayList(ArrayLists) 转换为字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42812670/

24 4 0