简体   繁体   中英

C# XML Serialization array and multiple class

Ihave problem with serialization XML and dont know how to bite it.. My xml file should look like this:

<?xml version="1.0" encoding="utf-8"?>
<ItemBag>
     <Bag>
         <BagConfig Name="txt" ZenDrop="0" ItemRate = "100" ExcRate="100" AncientRate="0" SocketRate="0"/>
     </Bag>
     <Default>
         <DefaultConfig cat="1" id="1" minlv="0" maxlv="15" skill="1" luck="1" addopt="0" exc= "0" anc="0" sock="0" />
     </Default>
     <Items> 
         <Item cat="1" id="1" minlv="0" maxlv="15" skill="1" luck="1" addopt="0" exc="0" anc="0" sock="0" />
         <Item cat="7" id="21" minlv="7" maxlv="7" skill="0" luck="0" addopt="0" exc="1" anc="0" sock="0" />
         <Item cat="8" id="21" minlv="7" maxlv="7" skill="0" luck="0" addopt="0" exc="1" anc="0" sock="0" />
         <Item cat="9" id="21" minlv="7" maxlv="7" skill="0" luck="0" addopt="0" exc="1" anc="0" sock="0" />         
     </Items> 
</ItemBag>

Here is my Serializable class:

[System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute()]
        [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
        public partial class ItemBag
        {
            public ItemBagBag Bag;

            public ItemBagDefault Default;

            [System.Xml.Serialization.XmlArrayItemAttribute("Item", IsNullable = true)]
            public ItemBagItem[] Items;
        }

        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute()]
        public partial class ItemBagBag
        {

            public ItemBagBagBagConfig BagConfig;
        }

        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute()]
        public partial class ItemBagBagBagConfig
        {

            [System.Xml.Serialization.XmlAttributeAttribute()]
            public string Name;

            [System.Xml.Serialization.XmlAttributeAttribute()]
            public sbyte ZenDrop;
            //.......ETC
        }


        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute()]
        public partial class ItemBagDefault
        {

            public ItemBagDefaultDefaultConfig DefaultConfig;
        }


        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute()]
        public partial class ItemBagDefaultDefaultConfig
        {
            [System.Xml.Serialization.XmlAttributeAttribute()]
            public sbyte cat;

            [System.Xml.Serialization.XmlAttributeAttribute()]
            public sbyte id;
         //........ETC
        }

        [System.SerializableAttribute()]
        [System.Xml.Serialization.XmlTypeAttribute()]
        public partial class ItemBagItem
        {

            [System.Xml.Serialization.XmlAttributeAttribute()]
            public sbyte cat;

            [System.Xml.Serialization.XmlAttributeAttribute()]
            public sbyte id;
       //.......ETC
        }

Here is Serializable method

    static void SerializationToXml()
    {

        XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
        namespaces.Add(string.Empty, string.Empty);


        ItemBag item = new ItemBag()


        {
            Bag = new ItemBagBag
            {
                BagConfig = new ItemBagBagBagConfig 
                { AncientRate = 1, ZenDrop = 1, ExcRate = 1, ItemRate = 1, Name = "ss", SocketRate = 1 }
            },
            Default = new ItemBagDefault
            {
                DefaultConfig = new ItemBagDefaultDefaultConfig 
                { addopt = 1, anc = 1, cat = 1, exc = 1, id = 1, luck = 1, maxlv = 1, minlv = 1, skill = 1, sock = 1, Value = "1" }
            },
            Items = new ItemBagItem[]
            {
                //doesent work :(
            }

        }; 
  TextWriter writer = new StreamWriter(@"c:\test.xml");
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(ItemBag));
                serializer.Serialize(writer, item, namespaces);
                writer.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
        }

I don't know how to make working an Array of Items (Bag and Default parsing OK) I count for Your help

Did you a favor and tidied things up... working nice too.

Code here:

internal class Program
    {
        private static void Main(string[] args)
        {
            ItemBag item = new ItemBag()
            {
                Bag = new Bag
                {
                    BagConfig = new BagConfig { AncientRate = 1, ZenDrop = 1, ExcRate = 1, ItemRate = 1, Name = "ss", SocketRate = 1 }
                },
                Default = new Default
                {
                    DefaultConfig = new DefaultConfig { Addopt = 1, Anc = 1, Category = 1, Exc = 1, ID = 1, Luck = 1, MaxLevel = 1, MinLevel = 1, Skill = 1, Sock = 1 }
                },
                Items = new List<Item>()
                {
                    { new Item { Addopt = 1, Anc = 1, Category = 1, Exc = 1, ID = 1, Luck = 1, MaxLevel = 1, MinLevel = 1, Skill = 1, Sock = 1 }}
                }
            };

            string serialized = item.XmlSerialize();

            Console.WriteLine(serialized);
            Console.ReadLine();
        }
    }

    [XmlRoot]
    public class ItemBag
    {
        public Bag Bag { get; set; }

        public Default Default { get; set; }

        [XmlArray("Items")]
        [XmlArrayItem("Item")]
        public List<Item> Items { get; set; }

        public ItemBag()
        {
            Bag = new Bag();
            Default = new Default();
            Items = new List<Item>();
        }
    }

    public class Bag
    {
        public BagConfig BagConfig { get; set; }

        public Bag()
        {
            BagConfig = new BagConfig();
        }
    }

    public class BagConfig
    {
        [XmlAttribute]
        public string Name { get; set; }

        [XmlAttribute]
        public int ZenDrop { get; set; }

        [XmlAttribute]
        public int ItemRate { get; set; }

        [XmlAttribute]
        public int ExcRate { get; set; }

        [XmlAttribute]
        public int AncientRate { get; set; }

        [XmlAttribute]
        public int SocketRate { get; set; }
    }

    public class Default
    {
        public DefaultConfig DefaultConfig { get; set; }

        public Default()
        {
            DefaultConfig = new DefaultConfig();
        }
    }

    public class DefaultConfig
    {
        [XmlAttribute("cat")]
        public int Category { get; set; }

        [XmlAttribute("id")]
        public int ID { get; set; }

        [XmlAttribute("minlv")]
        public int MinLevel { get; set; }

        [XmlAttribute("maxlv")]
        public int MaxLevel { get; set; }

        [XmlAttribute("skill")]
        public int Skill { get; set; }

        [XmlAttribute("luck")]
        public int Luck { get; set; }

        [XmlAttribute("addopt")]
        public int Addopt { get; set; }

        [XmlAttribute("exc")]
        public int Exc { get; set; }

        [XmlAttribute("anc")]
        public int Anc { get; set; }

        [XmlAttribute("sock")]
        public int Sock { get; set; }
    }

    public class Item
    {
        [XmlAttribute("cat")]
        public int Category { get; set; }

        [XmlAttribute("id")]
        public int ID { get; set; }

        [XmlAttribute("minlv")]
        public int MinLevel { get; set; }

        [XmlAttribute("maxlv")]
        public int MaxLevel { get; set; }

        [XmlAttribute("skill")]
        public int Skill { get; set; }

        [XmlAttribute("luck")]
        public int Luck { get; set; }

        [XmlAttribute("addopt")]
        public int Addopt { get; set; }

        [XmlAttribute("exc")]
        public int Exc { get; set; }

        [XmlAttribute("anc")]
        public int Anc { get; set; }

        [XmlAttribute("sock")]
        public int Sock { get; set; }
    }

And you can use this extension method:

/// <summary>
        /// Serializes the specified System.Object and returns the serialized XML
        /// </summary>
        /// <typeparam name="T">This item's type</typeparam>
        /// <param name="item">This item</param>
        /// <param name="removeNamespaces">
        ///     <para>Specify whether to remove xml namespaces.</para>para>
        ///     <para>If your object has any XmlInclude attributes, then set this to false</para>
        /// </param>
        /// <returns>Serialized XML for specified System.Object</returns>
        public static string XmlSerialize<T>(this T item, bool removeNamespaces = true)
        {
            object locker = new object();

            XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
            xmlns.Add(string.Empty, string.Empty);

            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.OmitXmlDeclaration = true;

            lock (locker)
            {
                StringBuilder stringBuilder = new StringBuilder();
                using (StringWriter stringWriter = new StringWriter(stringBuilder))
                {
                    using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings))
                    {
                        if (removeNamespaces)
                        {
                            xmlSerializer.Serialize(xmlWriter, item, xmlns);
                        }
                        else { xmlSerializer.Serialize(xmlWriter, item); }

                        return stringBuilder.ToString();
                    }
                }
            }
        }

put the extension method into a static class somewhere..

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM