【问题标题】:What would be more appropriate for my need (XML\Json) and how do I use it?什么更适合我的需要(XML\Json)以及如何使用它?
【发布时间】:2015-09-20 19:59:17
【问题描述】:

我正在用 C# 制作一个游戏(如果有影响,那就是 MonoGame),并且该游戏同时具有服务器和客户端。
我希望客户端保存某种项目的文本表示,这样当我加载客户端时,它会读取文件并将其解析为游戏对象,以便我可以轻松处理项目。

我考虑过使用 XML 或 JSON,我知道两者的基础知识,但我真的不知道
如何在代码中使用它们。

你觉得哪个更合适?我认为 XML 更合适,但我可能错了,这就是我问的原因......

文件会有这种结构

<items>
  <item>
    <id></id>
    <name></name>
    <cost></cost>
    <description></description>
    <pathofimage></pathofimage>
  </item>
  <item>
    <id></id>
    <name></name>
    <cost></cost>
    <description></description>
    <pathofimage></pathofimage>
  </item>
</items>

根据这个示例结构,我如何从文件中获取数据?

【问题讨论】:

  • 巧合(?)屏幕右侧的相关问题列表显示了一些不错的起点。
  • 考虑有效载荷。如果要在服务器和客户端之间进行通信,JSON(由于它的符号)将更加轻量级。对于大量数据,这可能很重要。
  • 我仍在考虑如何处理它,因为我认为最终,我将拥有一个服务器和客户端不同的 ItemPool 实现(服务器具有所有逻辑,客户端只需要具有视觉效果),所以最终我认为关于项目的通信将是传输项目的 ID,这将由我手动同步。

标签: c# json xml


【解决方案1】:

视情况而定,使用 System.Xml 或 System.Xml.Linq 等内置 .NET 命名空间更易于使用 XML。

如果您将在 javascript 或某些公共游戏 API 中使用此数据,JSON 可能会更好,但它需要一些第三方库来使用它,例如 JSON.NET(它提供更好的 json 支持)。而且 json 比 xml 更轻量级,并且 json 中的大量数据会更小。

使用 linq for xml 解析代码示例(System.Xml.Linq 命名空间):

var xmlString = @"<items>
  <item>
    <id>100</id>
    <name>lance</name>
    <cost>9.99</cost>
    <description></description>
    <pathofimage></pathofimage>
  </item>
  <item>
    <id>101</id>
    <name>sword</name>
    <cost>12.50</cost>
    <description></description>
    <pathofimage></pathofimage>
  </item>
</items>";

var doc = XDocument.Parse(xmlString);
var items = doc.Root.Elements("item").Select(e => new {
                                    Id = int.Parse(e.Element("id").Value), 
                                    Name = e.Element("name").Value, 
                                    Cost = decimal.Parse(e.Element("cost").Value)});

结果:

(我在这里使用 LinqPad 来表示结果,强烈推荐它来玩 linq 和 linq for xml)

【讨论】:

  • 嘿伙计,谢谢你的解释!我现在正在尝试一些东西,我一定会检查你的方法。只是为了澄清,我可以简单地使用文件流读取文件的文本并执行相同的操作,对吗?
  • 欢迎您!是的,您可以将文件读入字符串并以相同的方式使用它
  • 或者您可以使用 XDocument.Load 方法并使用文件名或流
  • var xml = XDocument.Load("itemsdoc.xml"); var items = xml.Root.Elements("item"). Select(e => new Item() { ID = int.Parse(e.Element("id").Value), Name = e.Element("name").Value, Cost = int.Parse(e.Element ("cost").Value), Description = e.Element("description").Value, Asset = e.Element("path").Value }); foreach (var item in items) { Debug.Print(item.ToString()); }
  • 它给出了 NullReferenceException。在调试中,我通过 Select 方法,它尝试执行 in items 并抛出,标记 new Item()...
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 2018-05-16
  • 2018-01-07
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多