将多种数据类型发送到远程服务器

时间:2010-01-19 11:32:29

标签: java xml sockets

我正在使用Java编写客户端和服务器,客户端发送创建证书的请求。这个请求包含很多不同的数据类型,包括byte [],我现在这样做的方式是使用ObjectStreams,如:

objectStream.writeObject( new String("value of field1"));
objectStream.flush();
objectStream.writeObject( new String("value of field"));
objectStream.flush();
objectStream.writeObject( publicKey);
objectStream.flush();
...

现在我知道这是非常糟糕的设计,但我不太确定如何改进它。

XML会是一个好主意吗?

感谢,

4 个答案:

答案 0 :(得分:2)

您有几种选择:

  • 通过实现接口使您的对象可用,并确保所有字段都是可序列化的(byte []是)。然后,您只需拨打objectStream.writeObject(myObj);
  • 即可
  • XML不是一个坏主意。如果另一方始终是Java,您可以使用XMLEncoderXMLDecoder转换为XML或从XML转发并通过网络发送。更重要的替代方案是使用JAXB - 在跳入之前先阅读一下它,因为它的用法更复杂(但是你可以用另一种语言使用其他语言)。

答案 1 :(得分:1)

如果整个应用程序是用Java构建的,并且不必包含其他平台,您是否考虑过使用RMI?

您仍然需要处理序列化,但是您可以更原生地实现应用程序,而不必担心编组/解组或低级序列化等问题。

答案 2 :(得分:1)

使用Java序列化将服务器和客户端绑定到Java并且还使升级成为问题(是的,有很多方法可以解决它,但它常常是问题的根源)。 XML非常冗长,虽然可以处理少量数据,但不能很好地扩展。

我建议使用类似JSONFUDGE的内容,以便以简洁的编码方式发送名称值对。

答案 3 :(得分:1)

  

现在我知道这很糟糕   设计

你为什么这么认为? Java序列化易于使用和工作。 Don't complicate things needlessly.

知道您是否必须容纳非Java参与者,或者在不能更新现有客户端的情况下发展协议?这些都是担心协议的原因。否则,做最简单的工作。将所有字段放在一个类中,制作Serializable,它甚至比你现在所做的更简单。确保在一个地方保留与之相关的所有逻辑,如果您需要更便携的协议,那么序列化为XML或JSON而不是ObjectOutputStream并不会太难。