使用C#在网络上保持最新的对象列表

时间:2013-08-18 19:36:30

标签: c# list object networking type-conversion

我是一名初学者,正试图获取存储在服务器上的对象列表,客户端可以连接并查看/编辑此列表。

我会尽力解释我的设置。

服务器: 这将包含一个“主列表”,其中包含该列表类型的所有对象。当客户想要更新时,需要将该列表传递给客户端,以便他们可以阅读。

客户端: 客户端将从服务器读取更新的列表,当他们对列表进行更改时,需要将此更改发送到服务器。

现在我想我只能让一个客户端可以随时编辑列表,并且由于可以添加/删除/更改/列表中的内容已更改,我认为最好只有客户端将其列表发送到服务器以替换服务器。这样,因为只有1个人正在编辑列表,所以列表应该保持更新。

我的问题是我找不到通过网络发送对象列表的简单方法。目前我可以通过一次将一个对象转换为XML然后返回来实现它,但因为它是一个需要大量代码的列表。我希望有人知道通过网络移动对象列表或将对象列表转换为字符串/返回的更简单方法。

我正在做的一个简单的例子是想象人们可以点击和移动的字段上的图片,所以我需要跟踪图像的顺序,x / y和图像名称。这是一个粗略的例子。

请让我知道您的想法,任何帮助将不胜感激。我是初学者,所以我为任何不正确的术语道歉。

谢谢。

2 个答案:

答案 0 :(得分:1)

文本协议

  • XML
  • JS​​ON
  • HTML / SOAP

XML工作得很好,特别是如果你刚刚学习的话。它很简单,而且你已经足够学习,而不必过多担心效率。网络是一个很大的主题!

JSON比XML更简洁,同样可读。我不认为C#内置了JSON序列化,所以你需要第三方库。

网络服务很简单。交换的信息会更大,但随着Web服务器的优化,这将更具可扩展性。但是,我不建议创建一个简单的Web服务,因为它会教你少于直接使用套接字。

二进制协议

  • 内置序列化
  • 第三方(Protobuf或Thrift)
  • 手工序列化

如果需要快速发送/接收数据,或者您希望服务器具有更高的可扩展性,我建议使用二进制协议。二进制协议很小,难以阅读。

如果所有客户端和服务器都是基于C#的,那么只需使用C#内置的序列化产品即可。它比其他序列化解决方案更冗长,但它是最简单的解决方案。同样,在您学习的过程中,如果您需要二进制协议,我建议使用内置序列化。

如果不是所有的客户端和服务器都是基于C#的,请使用像Google Protobufs或Apache Thrift这样的库,它提供了一种方法,可以非常轻松,高效地以不同语言对二进制协议中的对象进行序列化。

最后的解决方案是手动序列化。它将是非常快速但不灵活,困难,乏味且难以维护的。我不建议。

答案 1 :(得分:0)

不要来回发送整个列表。仅发送更新。

服务器应该保存已编译的列表,并且还应该保存上次整个列表为“快照”时所有更改的列表。

更新是:

  • 删除
  • 编辑
  • 添加

如果您没有太多数据,可以使用简单的xml。

收到后,每次更新都应从服务器获取序列号。这样,每个客户端都知道上次更新号码,并且可以通过轮询来请求新的更新。

连接后,客户应该:

  • 从服务器请求快照(接收最后一次ID快照)

稍后,客户应该:

  • 定期轮询新更新并将更新存储在本地列表中

客户端发生任何变更后,客户应:

  • 打包更改并将其发送到服务器

实施这将既具有挑战性又有趣。并且肯定会在这里创建更多问题:)