我应该为这个字符串数据使用什么类型的OO数据结构?

时间:2009-02-02 20:35:28

标签: .net oop serialization data-structures

假设我的程序总是传递一个字符串,表示Wiki语法中的数据表。类似的东西:

  {||Client:||ABC|-|Contact:||Joe Smith|-|Current revision:||1.0||}

我不希望每个特定的Wiki表对象(例如,ClientContactTable,CustomerOrderTable等)都知道如何解析|和 - 和}。所以我想编写一大块代码,将字符串解析为一些“中间”层数据对象,我可以将其传递给每个特定Wiki表对象的构造函数。

我的问题是:该中间层对象应该是什么?

4 个答案:

答案 0 :(得分:3)

您希望实现System.Runtime.IFormatter来创建通用的WikiTable序列化格式化程序。为了帮助您解决这个问题,您可以继承System.Runtime.Formatter基类。

完成后,您可以这样使用它:

Stream msg = GetWikiClientContactTableMessage();
WikiTableFormatter wtf = new WikiTableFormatter(); // nice name ;)
ClientContactTable result = (ClientContactTable)wtf.Deserialize(msg);

此外,如果您更喜欢XmlSerializer并且使调用者将预期的输出类型传递给构造函数,则此代码可能会更容易编写。然后,如果需要,您可以使用反射来获取您期望的属性。

答案 1 :(得分:0)

我会选择从字符串到字符串的地图。

这不是特别OO,但是它会完成这项工作,除非我对这项工作有所了解。

答案 2 :(得分:0)

我会使用Dictionary或Hash表。

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

如果msdn文档难以阅读(总是适合我),我会给出一个快速概述。 基本上,字典将对象(字符串?)作为键,将另一个对象作为数据。

Dictionary<string,string> d = new Dictionary<string,string>();
d["key1"] = "value";
d["anotherkey"] = "anothervalue";

答案 3 :(得分:0)

正如其他人所说,如果您希望名字作为键,请使用关联映射(string-&gt; string)。那应该是最干净的方式;这意味着您的解析代码可以包含许多输入检查和错误处理,否则将为每个对象类重复。

如果您必须包含多个具有相同名称的条目(例如,同一客户端的多个联系人),您可以回退到(字符串,字符串)对的列表。