我正在尝试将 .net 数组序列化为 XML。这是我想出的一段代码:
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 内容:
<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>
但这并不是我真正想要的。我希望它看起来像这样:
<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>
我怎样才能让它以这种方式工作?提前致谢!
最佳答案
除了已经提供的建议之外,您只需对代码进行一些小的更改。
首先需要重新声明 SerializeObject 泛型方法:
// 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<Person[]>(p)
与 SerializeObject<Person>(p)
.因此,您的 Main() 方法将如下所示:
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 将如下所示:
<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>
覆盖<Person>
元素名称为其他名称,设置 XmlType
类的属性,如下所示:
[XmlType("personEntry")]
public class Person
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public uint Age { get; set; }
}
生成的 XML 如下所示:
<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>
关于c# - 数组到 XML 的 .NET 序列化。如何为数组类型设置别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3618605/