最佳实践是创建一个C#对象,该对象反映并生成序列化字符串

本文关键字:对象 字符串 序列化 创建 一个 最佳 | 更新日期: 2023-09-27 18:09:09

这个问题以前可能被问过或回答过,但我觉得没有一个命中率真正适用。

我想创建一个具有属性的小类,这些属性将与xml流熟悉的输出中的名称和属性相对应。该类应该帮助程序创建一个类似xml的字符串。

string test = "<graph caption='SomeHeader' attribute9='#someotherinfo'>" +
                 "<set name='2004' value='37800' color='AFD8F8' />" +
                 "<set name='2005' value='21900' color='F6BD0F' />" +
                 "<set name='2006' value='32900' color='8BBA00' />" +
                  "<set name='2007' value='39800' color='FF8E46' />" +
              "</graph>";

我想你已经明白了。我有一个静态数量的已知属性,将在标签中使用。这里唯一的标签是

,我想做这样的事情

Helper o = new Helper()
List<Tag> tag = new List<Tag>();
foreach (var someitem in somedatabaseresult)
{
   tag.Add(New Graph() { Caption = someitem.field , attribute9 = someitem.otherField });
   foreach (var detail in someitem)
   {
     tag.Add(new Set() { name = detail.Year, value = detail.Value color = detail.Color });
   }
}
o.Generate(); // Which will create the structure of result sample above
// and for future extension.. 
// o.GenerateXml();
// o.GenerateJson();

请记住,这个代码是pesudo,只是从我的脑海中提取的。因此,我有了一些想法,但它需要一天的时间来编码和测试什么是最好的(或妓女(。

解决这项任务的最佳实践是什么?

[编辑]
这个神秘的"Helper"是一个(不幸键入的(类,它包含Graph列表、Set列表,并且(我认为(包含每个Graph/Set对象的所有可用属性。上面提到的foreach循环的工作是用数据填充Helper类。

[编辑2]此处显示结果,
https://gist.github.com/1233331

最佳实践是创建一个C#对象,该对象反映并生成序列化字符串

为什么不创建两个类:Graph和Set。图将具有List<Set>的属性。

然后,在foreach中,您可以创建一个实例或Graph,并将Set的实例添加到其列表中。

完成后,使用XML序列化程序将Graph对象序列化为XML。如果以后需要更改,也可以很容易地输出到另一种格式,例如序列化为JSON。

编辑以下评论:

从我的头顶上看,这可能不是100%正确的。。。

var myGraph = BuildMeAGraph();
var serializer = new XmlSerializer(typeof(Graph));
var writer = XmlWriter.Create("myfile.xml");
serializer.Serialize(writer, myGraph);

但是像这样的东西应该把它写在一个文件里。如果您想将XML存储在内存中,则将其写入基于内存流的XMLTextWriter,然后您可以将内容写入字符串变量或对其执行任何需要的操作。

如果你想在对象树之外创建一个XML,那么我认为,你可以尝试一下:

XDocument doc = new XDocument
(
   somedatabaseresult.Select
   ( someitem =>
     new XElement("graph", 
                  new XAttribute("Caption", ""),
                  new XAttribute("attribute9", "#something"),
                  someitem.Select
                  (detail =>
                      new XElement("Set", 
                                   new XAttribute("name", "2003"),            
                                   new XAttribute("value", "34784"),
                                   new XAttribute("color", "#003300")
                  )    
   )
);
//save to file as XML
doc.Save("output.xml");
//save to local variable as XML string
string test = doc.ToString();

我为标签编写了保存值,正如您在代码中所使用的那样。然而,我想你会喜欢这个:

new XAttribute("name", detail.name),            
new XAttribute("value", detail.value),
new XAttribute("color", detail.color)

或者您想给对象detail中的每个属性的任何值。

使用XmlSerializer。

我会使用ExpandoObject,但我看不出你这样做的原因。