【问题标题】:Sending objects through sockets通过套接字发送对象
【发布时间】:2012-03-13 08:53:01
【问题描述】:

我过去做过的唯一套接字编程是简单的文本流。我想知道通过套接字发送 Java 对象之类的最有效方法是什么。

例如,如果我有以下 Employee 类(Dependent 将是一个由依赖者信息组成的简单类):

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

我是否应该让 Employee 对象可序列化并通过套接字发送实例。或者我应该写一个包含员工信息的 xml 文件并发送它?任何指导将不胜感激。还是有一些完全不同的更好的方法?谢谢!

【问题讨论】:

    标签: java xml sockets serialization network-programming


    【解决方案1】:

    如果您只在 Java JVM 之间发送数据,那么任一种选择都是可能的。

    文本表示(XML、JSON 或自定义)有几个优点:

    • 使其更容易在 Java 和其他语言之间进行互操作
    • 面对版本更改或套接字两端的代码版本略有不同时,它不会那么脆弱
    • 测试和调试要容易得多

    根据格式,它可能会慢一些,但这通常并不重要。

    【讨论】:

    • 听说JSON编码比序列化快,但JSON解码比反序列化慢
    【解决方案2】:

    如果您不一定要使用 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);
    

    【讨论】:

      【解决方案3】:

      如果您必须直接使用低级套接字,有几种方法可以实现。您可以将其转换为文本格式并发送字节,然后在另一端重建它。如果您的对象是可序列化的,您可以通过套接字 (http://www.rgagnon.com/javadetails/java-0043.html) 发送它们。

      如果您有一定的灵活性,您也可以使用 RMI 进行远程交互。

      【讨论】:

      • 杰夫,在这种特殊情况下,RMI 的用途是什么?
      猜你喜欢
      • 2019-04-21
      • 2014-01-11
      • 2022-01-15
      • 2021-01-11
      • 2014-11-13
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      相关资源
      最近更新 更多