我想弄清楚.NET数组的序列化XML。这里有一块code,我已经想出了:
I'm trying to figure out serialization of .net arrays to XML. Here's a piece of code that I've come up with:
public class Program
{
public class Person
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public uint Age { get; set; }
}
static void Main ()
{
Person[] p =
{
new Person{Age = 20, Firstname = "Michael", Lastname = "Jackson"},
new Person{Age = 21, Firstname = "Bill", Lastname = "Gates"},
new Person{Age = 22, Firstname = "Steve", Lastname = "Jobs"}
};
SerializeObject<Person[]>(p);
}
static void SerializeObject<T>(T obj) where T : class
{
string fileName = Guid.NewGuid().ToString().Replace("-", "") + ".xml";
using (FileStream fs = File.Create(fileName))
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer ser = new XmlSerializer(typeof(T));
ser.Serialize(fs, obj, ns);
}
}
}
下面的这个例子记到XML文件中的XML内容:
Here's an XML content that this example writes down to the XML file:
<ArrayOfPerson>
<Person>
<Firstname>Michael</Firstname>
<Lastname>Jackson</Lastname>
<Age>20</Age>
</Person>
<Person>
<Firstname>Bill</Firstname>
<Lastname>Gates</Lastname>
<Age>21</Age>
</Person>
<Person>
<Firstname>Steve</Firstname>
<Lastname>Jobs</Lastname>
<Age>22</Age>
</Person>
</ArrayOfPerson>
但是,这是不是真的是我想要的。我想它是这样的:
But this is not really what I want. I would like it to look like this:
<Persons>
<Person>
<Firstname>Michael</Firstname>
<Lastname>Jackson</Lastname>
<Age>20</Age>
</Person>
<Person>
<Firstname>Bill</Firstname>
<Lastname>Gates</Lastname>
<Age>21</Age>
</Person>
<Person>
<Firstname>Steve</Firstname>
<Lastname>Jobs</Lastname>
<Age>22</Age>
</Person>
</Persons>
我怎么能得到它的工作这样?在此先感谢!
How could I get it working this way? Thanks in advance!
您只需要进行一些小的变化到code,除了已经提供的建议。
You just need to make some small changes to your code, in addition to the suggestions already provided.
首先,SerializeObject泛型方法需要被这样重新声明:
First the SerializeObject generic method needs to be redeclared thus:
// important: declare the input parameter to be an **array** of T, not T.
static void SerializeObject<T>(T[] obj) where T : class
{
string fileName = Guid.NewGuid().ToString().Replace("-", "") + ".xml";
using (FileStream fs = File.Create(fileName))
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
// override default root node name. based on your question,
// i'm just going to append an "s" to the base type
// (e.g., Person becomes Persons)
var rootName = typeof(T).Name + "s";
XmlRootAttribute root = new XmlRootAttribute(rootName);
// add the attribute to the serializer constructor...
XmlSerializer ser = new XmlSerializer(obj.GetType(), root);
ser.Serialize(fs, obj, ns);
}
}
其次,在main()方法,将 SerializeObject&LT;人[]≥(P)
与 SerializeObject&LT;人&GT(P)
。因此,您的Main()方法是这样的:
Secondly, in the Main() method, replace SerializeObject<Person[]>(p)
with SerializeObject<Person>(p)
. Thus your Main() method will look like this:
static void Main(string[] args)
{
Person[] p =
{
new Person{Age = 20, Firstname = "Michael", Lastname = "Jackson"},
new Person{Age = 21, Firstname = "Bill", Lastname = "Gates"},
new Person{Age = 22, Firstname = "Steve", Lastname = "Jobs"}
};
SerializeObject<Person>(p);
}
生成的XML如下所示:
The resulting XML will look like this:
<Persons>
<Person>
<Firstname>Michael</Firstname>
<Lastname>Jackson</Lastname>
<Age>20</Age>
</Person>
<Person>
<Firstname>Bill</Firstname>
<Lastname>Gates</Lastname>
<Age>21</Age>
</Person>
<Person>
<Firstname>Steve</Firstname>
<Lastname>Jobs</Lastname>
<Age>22</Age>
</Person>
</Persons>
要覆盖&LT;人&GT;
元素的名称到别的东西,将 XmlType将
属性的类,像这样:
To override the <Person>
element name to something else, set the XmlType
attribute on the class, like so:
[XmlType("personEntry")]
public class Person
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public uint Age { get; set; }
}
生成的XML看起来是这样的:
The resulting XML looks like this:
<Persons>
<personEntry>
<Firstname>Michael</Firstname>
<Lastname>Jackson</Lastname>
<Age>20</Age>
</personEntry>
<personEntry>
<Firstname>Bill</Firstname>
<Lastname>Gates</Lastname>
<Age>21</Age>
</personEntry>
<personEntry>
<Firstname>Steve</Firstname>
<Lastname>Jobs</Lastname>
<Age>22</Age>
</personEntry>
</Persons>