Отправка объектов через сокеты - PullRequest
4 голосов
/ 23 февраля 2012

Единственное программирование сокетов, которое я делал в прошлом, это простые текстовые потоки. Мне интересно, какой самый эффективный способ отправить что-то вроде объекта Java через сокет.

Например, если у меня есть следующий класс Employee (зависимым будет простой класс, состоящий из информации зависимого):

public class Employee {
    private String name;
    private double salary;
    private ArrayList<Dependent> dependents;
}

Должен ли я просто сделать объект Employee Serializable и отправлять экземпляры через сокет. Или я должен написать XML-файл, содержащий информацию о сотрудниках, и отправить его? Любое руководство будет с благодарностью. Или есть какой-то совершенно другой и лучший способ? Спасибо!

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

Если вы отправляете данные только между Java JVM, то возможен любой вариант.

Текстовое представление (XML, JSON или пользовательское) имеет несколько преимуществ:

  • проще сделать его совместимым между Java и другими языками
  • это менее хрупко перед лицом изменений версии или немного разных версий вашего кода на каждом конце сокета
  • гораздо проще тестировать и отлаживать

В зависимости от формата, он может быть немного медленнее, но это часто не имеет значения.

3 голосов
/ 23 февраля 2012

Если вы не обязательно связаны с использованием XML, вы также можете попробовать JSON. Библиотека google-gson делает это очень тривиальным. Для сериализации кода это так же просто, как: -

Employee employee = new Employee();
...

Gson gson = new Gson();
String json = gson.toJson(employee);

И для десериализации String на другом конце: -

String socketDataAsString = null;
...<read from socket>...

Gson gson = new Gson();
Employee employee = gson.fromJson(socketDataAsString, Employee.class);
0 голосов
/ 23 февраля 2012

Если вы должны напрямую использовать низкоуровневые сокеты, есть несколько способов сделать это. Вы можете преобразовать его в текстовый формат и отправить байты, а затем восстановить его на другой стороне. Если ваши объекты сериализуемы, вы можете отправить их через сокет (http://www.rgagnon.com/javadetails/java-0043.html).

Если у вас есть некоторая гибкость, вы можете использовать RMI для удаленного взаимодействия.

...