.NET序列化为XML.如何为数组类型设置别名?

the*_*e_V 2 .net c# xml arrays serialization

我试图找出.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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

以下是此示例写入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>
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的.我希望它看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

我怎么能这样工作呢?提前致谢!

cod*_*ife 5

除了已经提供的建议之外,您只需对代码进行一些小的更改.

首先,需要重新声明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);
    }
}
Run Code Online (Sandbox Code Playgroud)

其次,在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);
}
Run Code Online (Sandbox Code Playgroud)

生成的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>
Run Code Online (Sandbox Code Playgroud)

要将<Person>元素名称覆盖为其他名称,请XmlType在类上设置属性,如下所示:

[XmlType("personEntry")]
public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public uint Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

生成的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>
Run Code Online (Sandbox Code Playgroud)