假设我想在使用TCP套接字的java中编写的两个程序之间发送许多消息。
我认为最方便的方法是发送像:
这样的对象PrintStream ps = new PrintStream(s.getOutputStream());
ObjectOutputStream oos = new ObjectOutputStream(ps);
some_kind_of_object_here;
oos.writeObject(some_kind_of_object_here);
ps.print(oos);
我想发送,字符串,数字,HashMaps,布尔值 如何使用可以存储所有属性的fx 1对象来执行此操作? 我虽然关于ArrayList是可序列化的,我们可以放在那里,但不是优雅的方式。 我想发送不同类型的数据,因为用户可以从服务器可以为其执行的各种选项中进行选择。 有什么建议吗?
答案 0 :(得分:2)
您是否考虑过使用RMI?
如果您需要额外的表现,请坚持使用Serializable
甚至Externalizable
。
您不需要像Lists这样的包装器类。当然,您可以构建自己的包装器对象,以保存所有相关数据。这样的“应用程序数据单元”将帮助您处理发送entite的正确顺序。只要所有成员都是Serializable
,一旦将包装器对象放入对象流中,就会自动序列化完整的对象图。
如果您不使用包装器类,只需确保您要转发的每个对象/类型至少实现Serializable
。然后,您必须验证数据发送的顺序是否与您要到达的数据之外的顺序相对应。
答案 1 :(得分:1)
您编写代码的方式,已经可以发送任何 Java对象。当然,这些对象包括“字符串,数字,HashMaps,布尔值”。
只需写入ByteArrayOutputStream:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.write(javaObject);
oos.close();
socket.write(baos.toByteArray())
答案 2 :(得分:1)
Master,您知道可以将任何可序列化对象通过套接字发送到另一个JVM,是吗?
如果是这样,最简单的方法是让一个包含所有对象的可序列化对象,然后转发它。对象列表可能是最简单的。然后,您可以在另一侧反序列化它,并以您需要的任何方式处理列表中的对象。
我建议您阅读Java中的序列化技术,这样您就可以了解所有可以做的聪明事项。
http://java.sun.com/javase/7/docs/technotes/guides/serialization/index.html
答案 3 :(得分:0)
如果你需要保持较小的数据包,可以使用普通的Object[]
,放置你想要的任何内容,并使用指定数据包类型的枚举,允许你在内部存储多少和哪种对象。消息。
class Message
{
Type t;
Object[] params;
}
当然,在选择如何处理每个数据包时,你必须根据Type t
进行切换,但由于协议通常是FSM(取决于你编码的是什么),这样可以很好地工作而不会浪费太多空间或者在不需要时分配列表。