【问题标题】:c# xml serialization showing reversed object graphc# xml序列化显示反向对象图
【发布时间】:2015-12-24 16:07:51
【问题描述】:

我是 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>

【问题讨论】:

    标签: c# xml serialization xml-serialization xmlserializer


    【解决方案1】:

    通常,元素顺序在序列化中并不重要,但话虽如此,您可以使用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);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      仅使用公共属性,顺序将如您所愿。无需指定明确的顺序。

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多