[英]List of items with empty properties after xml serialization
I try serialize xml to my classes:我尝试将 xml 序列化到我的类:
[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.序列化后,我得到了具有良好列表长度的对象,但其元素的 id、lp、名称和数量为空。
UPDATE serialization method UPDATE序列化方法
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像这样,然后我添加 using 块
UPDATE#2 I try this xml更新#2我试试这个 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.请注意,您的某些属性是用
XMLElement
修饰的,而它们是属性,因此应该用XMLAttribute
修饰。
(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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.