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

C# 使用C在网络上保持对象列表的最新状态#,c#,list,object,networking,type-conversion,C#,List,Object,Networking,Type Conversion,我是一个初学者,正在尝试将对象列表存储在服务器上,客户端可以连接并查看/编辑该列表 我会尽力解释我的设置是什么 服务器: 这将保存一个“主列表”,其中包含该列表类型的所有对象。当客户机需要更新时,需要将此列表传递给客户机,以便他们可以读取它 客户: 客户机将从服务器读取更新的列表,当他们对列表进行更改时,需要将此更改发送到服务器 现在,我想我可以做到在任何时候只有一个客户机可以编辑列表,而且由于可以添加/删除/更改/更改列表中的位置,我认为最好让客户机将其列表发送到服务器以替换服务器。这样,由于

我是一个初学者,正在尝试将对象列表存储在服务器上,客户端可以连接并查看/编辑该列表

我会尽力解释我的设置是什么

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

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

现在,我想我可以做到在任何时候只有一个客户机可以编辑列表,而且由于可以添加/删除/更改/更改列表中的位置,我认为最好让客户机将其列表发送到服务器以替换服务器。这样,由于只有1个用户将编辑列表,因此列表应保持更新

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

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

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

谢谢。

文本协议
  • XML
  • JSON
  • HTML/SOAP
XML工作得很好,尤其是在您刚刚学习的情况下。这很简单,你已经学到了足够多的东西,在这一点上你不用太担心效率。网络是一个大课题

JSON比XML稍微简单一点,相当于可读性。我认为C#没有内置JSON序列化,因此需要第三方库

web服务将很容易。交换的信息会更多,但随着web服务器的优化,这将更具可扩展性。但是,我不建议创建一个简单的web服务,因为它教给您的东西比直接使用套接字要少

二进制协议
  • 内置序列化
  • 第三方(Protobuf或Thrift)
  • 手工连载
如果数据需要快速发送/接收,或者您想要一个更具可扩展性的服务器,我建议使用二进制协议。二进制协议很小,很难读取

如果所有客户机和服务器都是基于C的,那么只需使用内置的序列化C。它比其他序列化解决方案更详细,但它是最简单的解决方案。同样,正如您正在学习的,如果您需要二进制协议,我建议使用内置序列化

如果不是所有的客户机和服务器都是基于C#的,那么可以使用像Google Protobufs或Apache Thrift这样的库,它提供了一种以二进制协议以不同语言序列化对象的方法,非常容易而且非常有效


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

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

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

更新内容如下:

  • 删除
  • 编辑
  • 添加物
如果您没有太多的数据,您可以使用简单的xml来处理所有事情

收到时,每次更新都应从服务器获取序列号。这样,每个客户端都知道上次更新的编号,并且可以通过轮询请求新的更新(如果可用)

连接后,客户端应:

  • 从服务器请求快照(接收最后一个ID快照)
稍后,客户应:

  • 定期轮询新更新,并将更新存储在本地列表中
客户发生任何变更时,客户应:

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

实现这一点既有挑战性又有乐趣。这里肯定还会产生一些问题:)

您可以将集合序列化为XML/JSON。