【问题标题】:How can an ArrayList of objects(ArrayLists) be converted to an array of bytes?如何将对象的 ArrayList(ArrayLists)转换为字节数组?
【发布时间】:2017-03-15 14:30:30
【问题描述】:

我目前有一个需要在客户端和服务器之间快速通信的 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 或其中的对象。

如果您需要我正在使用的代码的更多示例,请随时提出。上面的代码不是我的真实代码(因为对 ArrayList 进行编号会非常混乱),但它准确地表示了我想要实现的目标。

谢谢。

【问题讨论】:

  • 您可以使用serialization,或将您的对象转换为标准格式,例如 JSON 或 XML。
  • 我认为您必须为此使用序列化。你能查一下article吗?
  • 他已经在做序列化(字节数组)了。使用 JSON 或 XML(这两种格式只能用于 http 或更高的协议)只会减慢速度。如果 TCP 对您来说不够好,我也不认为 UDP 会有所帮助(因为它基本上是没有安全性的 TCP)。我想你正在使用 Java 套接字?
  • 另外,你也不能通过 TCP 发送 ArrayList,所以我不认为你一开始就使用 TCP。
  • 是的,可以使用 ObjectOutputStream 通过 TCP 发送 ArrayList。

标签: java arraylist udp byte


【解决方案1】:

要在 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();
    }
}

【讨论】:

    【解决方案2】:

    我发现此解决方案适用于使用序列化方法的 Java 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();
    }
    

    发送ArrayList,

    ArrayList<Object> array = new ArrayList<Object>();
    array.add(arrayList1);
    array.add(arrayList2);
    array.add(arrayList3);
    array.add(arrayList4);
    
    sendData = serialize(array);
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
    datagramSocket.send(sendPacket);
    

    然后接收它。

    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    clientSocket.receive(receivePacket);
    ArrayList<Object> object = (ArrayList)deserialize(receivePacket.getData());
    ArrayList<Object> arrayList = (ArrayList<Object>)object.get(0);
    

    这似乎对我有用,所以我认为这种方法应该对你有用。

    【讨论】:

      【解决方案3】:

      enter link description. 这是你的解决方案。

      对于 RMI,我就是这样做的

      在客户看来

      import java.rmi.Remote;
      import java.rmi.RemoteException;
      import java.util.ArrayList;
      import javax.swing.table.DefaultTableModel;
      
      public interface InterfaceUsuario extends Remote {   
        public ArrayList< User >getList() throws RemoteException;     
      }
      

      获取数组数据对象: 在客户看来

      InterfaceUser or;
              or = (InterfaceUser)Naming.lookup ("or");            
      ArrayList listUser = or.getList();
      

      在服务器视图中

      import org.hibernate.HibernateException;
      import org.hibernate.Session;
      import org.hibernate.Transaction;
      
      private Session sesion;
      private Transaction tx;
      
      public class UserDAO {
      
      public ArrayList<User> getListUser() throws Exception {
      ArrayList<User> listContacts = null;  
      
      try 
      { 
          sesion = HibernateUtil.getSessionFactory().openSession();
          tx = sesion.beginTransaction();
          listContacts = (ArrayList<User>) sesion.createQuery("from   User").list();           
      
      
      }finally 
      { 
          sesion.close(); 
      }  
      
      return listContacts; 
      }
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-14
        • 1970-01-01
        • 2015-05-13
        • 2018-09-08
        • 2021-11-30
        • 2019-09-02
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        相关资源
        最近更新 更多