简体   繁体   中英

List of items with empty properties after xml serialization

I try serialize xml to my classes:

[XmlRoot(ElementName = "order")]
public class OrderModel
{
    [XmlElement(ElementName = "purchaser")]
    public CompanyModel Purchaser { get; set; }

    [XmlElement(ElementName = "deliverver")]
    public CompanyModel Deliverver { get; set; }

    [XmlElement(ElementName = "position")]
    public List<OrderPositionModel> Positions { get; set; }
}

public class OrderPositionModel
{
    [XmlElement(ElementName = "id")]
    public int id { get; set; }

    [XmlElement(ElementName = "lp")]
    public int OrdinalNumber { get; set; }

    [XmlElement(ElementName = "name")]
    public string Name { get; set; }

    [XmlElement(ElementName = "quantity")]
    public int Quantity { get; set; }
}

After serialization I get object with good List length, but its elements have empty id, lp, name and quantitiy.

UPDATE serialization method

private object XmlReader(HttpPostedFileBase file, Type type)
    {
        var document = new XmlDocument();
        document.Load(file.InputStream);

        string stream = document.OuterXml;

        StringReader strReader = null;
        XmlSerializer serializer = null;
        XmlTextReader xmlReader = null;
        Object obj = null;

        try
        {
            strReader = new StringReader(stream);
            serializer = new XmlSerializer(type);
            xmlReader = new XmlTextReader(strReader);
            obj = serializer.Deserialize(xmlReader);
        }
        catch (Exception)
        {
            //Handle Exception Code
        }
        finally
        {
            if (xmlReader != null)
            {
                xmlReader.Close();
            }
            if (strReader != null)
            {
                strReader.Close();
            }
        }
        return obj;
    }

Something like this, then I add using block

UPDATE#2 I try this xml

<order>
<purchaser>
    <name>name1</name>
    <address>address1</address>
</purchaser>
<deliverver>
    <name>name2</name>
    <address>address2</address>
</deliverver>
<position id="17" name="pos1" lp="1" quantity="1"/>
<position id="21" name="pos2" lp="2" quantity="2"/>
</order>

Simplest working example:

Note that some of your properties were decorated with XMLElement while they're attributes and therefore should be decorated with XMLAttribute instead.

(I've also removed all of what was unnecessary)

using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var filename = @"..\..\XMLFile1.xml";
            var model = Read(filename);
        }

        private static OrderModel Read(string filename)
        {
            using (var reader = XmlReader.Create(filename))
            {
                var serializer = new XmlSerializer(typeof(OrderModel));
                var model = (OrderModel) serializer.Deserialize(reader);
                return model;
            }
        }
    }

    [XmlRoot(ElementName = "order")]
    public class OrderModel
    {
        [XmlElement(ElementName = "purchaser")]
        public CompanyModel Purchaser { get; set; }

        [XmlElement(ElementName = "deliverver")]
        public CompanyModel Deliverver { get; set; }

        [XmlElement(ElementName = "position")]
        public List<OrderPositionModel> Positions { get; set; }
    }

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

        [XmlAttribute("lp")]
        public int OrdinalNumber { get; set; }

        [XmlAttribute("name")]
        public string Name { get; set; }

        [XmlAttribute("quantity")]
        public int Quantity { get; set; }
    }

    public class CompanyModel

    {
        [XmlElement(ElementName = "name")]
        public string Name { get; set; }

        [XmlElement(ElementName = "address")]
        public string Address { get; set; }
    }
}

Try serializing that way, it works for me

       Example of using the class "ObjectSerialization"

        try
        {
            parmExtRoute viagens = new parmExtRoute();
            Stream streamXml = arquivoRecebido.InputStream;
            var document = new XmlDocument();
            document.Load(streamXml);

            string stream = document.OuterXml;
            viagens = ObjectSerialization.DeserializeObject<parmExtRoute>(stream);
            retorno.Result = viagens;
        }
        catch (Exception ex)
        {
            retorno.ListErrors.Add(ex.Message);
        }

        return retorno;
    



public static class ObjectSerialization
{
    public static string SerializeObject<T>(T dataObject)
    {
        if (dataObject == null)
            return string.Empty;

        try
        {
            using (var stringWriter = new StringWriter())
            {
                var namespaces = new XmlSerializerNamespaces();
                var settings = new XmlWriterSettings();
                settings.Encoding = new UnicodeEncoding(false, false);
                settings.Indent = false;
                settings.NewLineChars = string.Empty;
                settings.NewLineHandling = NewLineHandling.None;
                settings.OmitXmlDeclaration = true;
                namespaces.Add(string.Empty, string.Empty);
                var serializer = new XmlSerializer(typeof(T));

                using (var xmlWriter = XmlWriter.Create(stringWriter, settings))
                    serializer.Serialize(xmlWriter, dataObject, namespaces);

                return stringWriter.ToString();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(string.Format("Erro ao serializar objeto. ", ex.Message) + DateTime.Now.ReturnDateLocale());
            return string.Empty;
        }
    }
    public static T DeserializeObject<T>(string xml) where T : class
    {
        if (string.IsNullOrEmpty(xml))
            return Activator.CreateInstance<T>();

        try
        {
            using (var stringReader = new StringReader(xml))
            {
                var serializer = new XmlSerializer(typeof(T), new Type[] { typeof(T) }); ;
                return (T)serializer.Deserialize(stringReader);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(string.Format("Erro ao deserializar objeto. ", ex.Message) + DateTime.Now.ReturnDateLocale());
            return Activator.CreateInstance<T>();
        }
    }
    public static string ObjectParamWs<T>(T dataObject)
    {
        string conteudo = SerializeObject<T>(dataObject);
        string xml = conteudo;
        return xml;
    }
}

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