c# xml 显示反向对象图的序列化

c# xml serialization showing reversed object graph

我是 C# 新手,想将对象图序列化为 XML。 我快完成了,但由于未知原因,XML 向我展示了颠倒的对象图。

public class PersonalDetails
{
    public string Name { get; set; }
    public int Age { get; set; }

    public AddressDetails address;
    public PersonalDetails()
    {

    }
    public PersonalDetails(string Name, int Age, AddressDetails address)
    {
        this.Name = Name;
        this.Age = Age;
        this.address = address;
    }

    public class AddressDetails
    {
        [XmlElement("Number")]
        public int HouseNo;
        [XmlElement("Street")]
        public string StreetName;
        public string City;
        public AddressDetails()
        {

        }
        static void Main(string[] args)
        {

            AddressDetails address = new AddressDetails();
            PersonalDetails[] personal = new PersonalDetails[1];
            personal[0] = new PersonalDetails("Roberto", 15, address);

            address.HouseNo = 4;
            address.StreetName = "ABC";
            address.City = "Delhi";

            Serialize(personal[0]);
        }
        public static void Serialize(PersonalDetails personal)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(PersonalDetails));
            using (TextWriter writer = new StreamWriter("TestXML.xml"))
            {
                serializer.Serialize(writer, personal);
            }
        }
    }
}

这就是我当前 XML 的样子:

<PersonalDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <address>
    <Number>4</Number>
    <Street>ABC</Street>
    <City>Delhi</City>
  </address>
  <Name>Roberto</Name>
  <Age>15</Age>
</PersonalDetails>

但我想要这个:

<PersonalDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Roberto</Name>
  <Age>15</Age>
  <address>
    <Number>4</Number>
    <Street>ABC</Street>
    <City>Delhi</City>
  </address>
</PersonalDetails>

元素顺序通常在序列化中并不重要,但是据说您可以使用 XmlElement 属性(您已经在使用它来指定名称)。如果您真的希望它以特定方式订购,您可以在您的字段上使用 XmlElement 属性的 Order 属性:

public class PersonalDetails
{

    [XmlElement(Order = 1)]
    public string Name { get; set; }

    [XmlElement(Order = 2)]
    public int Age { get; set; }

    [XmlElement(Order = 3)]
    public AddressDetails address;
    public PersonalDetails()
    {

    }
    public PersonalDetails(string Name, int Age, AddressDetails address)
    {
        this.Name = Name;
        this.Age = Age;
        this.address = address;
    }

    public class AddressDetails
    {
        [XmlElement(ElementName = "Number", Order = 1)]
        public int HouseNo;
        [XmlElement(ElementName = "Street", Order = 2)]
        public string StreetName;
        [XmlElement(Order = 3)]
        public string City;
        public AddressDetails()
        {

        }
        static void Main(string[] args)
        {

            AddressDetails address = new AddressDetails();
            PersonalDetails[] personal = new PersonalDetails[1];
            personal[0] = new PersonalDetails("Roberto", 15, address);

            address.HouseNo = 4;
            address.StreetName = "ABC";
            address.City = "Delhi";

            Serialize(personal[0]);
        }
        public static void Serialize(PersonalDetails personal)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(PersonalDetails));
            using (TextWriter writer = new StreamWriter("TestXML.xml"))
            {
                serializer.Serialize(writer, personal);
            }
        }
    }
}

您正在混合使用 public 个字段和 public 个属性。 XmlSerializer 优先考虑字段。这就是为什么您会遇到看似违反直觉的元素顺序。

坚持使用 public 属性 ,顺序将如您所愿。无需指定明确的顺序。