Graeme_Grant
В приведенном выше коде отсутствует пара классов, поэтому я не могу полностью проверить, где может быть ошибка или с каким типом ошибки вы сталкиваетесь. Однако я использовал свой собственный код конвертера, и все было преобразовано без ошибок.
Вот что я использовал:
public static class XmlConverter
{
public static string FromClass<T>(T data)
{
string response = string.Empty;
var ms = new MemoryStream();
try
{
ms = FromClassToStream(data);
if (ms != null)
{
ms.Position = 0;
using (var sr = new StreamReader(ms))
response = sr.ReadToEnd();
}
}
finally
{
// don't want memory leaks...
ms.Flush();
ms.Dispose();
ms = null;
}
return response;
}
public static MemoryStream FromClassToStream<T>(T data, XmlSerializerNamespaces ns = null)
{
var stream = default(MemoryStream);
if (data != null)
{
var settings = new XmlWriterSettings()
{
Encoding = Encoding.UTF8,
Indent = true,
ConformanceLevel = ConformanceLevel.Auto,
CheckCharacters = true,
OmitXmlDeclaration = false
};
try
{
XmlSerializer serializer = XmlSerializerFactoryNoThrow.Create(typeof(T));
stream = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(stream, settings))
{
serializer.Serialize(writer, data, ns);
writer.Flush();
}
stream.Position = 0;
}
catch (Exception)
{
stream = default(MemoryStream);
}
}
return stream;
}
public static T ToClass<T>(string data)
{
var response = default(T);
if (!string.IsNullOrEmpty(data))
{
var settings = new XmlReaderSettings()
{
IgnoreWhitespace = true,
DtdProcessing = DtdProcessing.Ignore
};
XmlSerializer serializer = XmlSerializerFactoryNoThrow.Create(typeof(T));
using (var sr = new StringReader(data))
using (var reader = XmlReader.Create(sr, settings))
response = (T)Convert.ChangeType(serializer.Deserialize(reader), typeof(T));
}
return response;
}
}
// ref: http://stackoverflow.com/questions/1127431/xmlserializer-giving-filenotfoundexception-at-constructor/39642834#39642834
public static class XmlSerializerFactoryNoThrow
{
public static Dictionary<Type, XmlSerializer> cache = new Dictionary<Type, XmlSerializer>();
private static readonly object SyncRootCache = new object();
public static XmlSerializer Create(Type type)
{
XmlSerializer serializer;
lock (SyncRootCache)
if (cache.TryGetValue(type, out serializer))
return serializer;
//multiple variable of type of one type is same instance
lock (type)
{
//constructor XmlSerializer.FromTypes does not throw the first chance exception
serializer = XmlSerializer.FromTypes(new[] { type })[0];
}
lock (SyncRootCache) cache[type] = serializer;
return serializer;
}
}
А вот как им пользоваться:
var data = new FeePlanGenerate();
var xmlString = XmlConverter.FromClass(data);
ОБНОВЛЕНИЕ Я только что перечитал название вашего вопроса и увидел, что проблема на самом деле связана со свойствами списка в предоставленном классе.
Ответ зависит от того, как форматируются XML-данные. Я предполагаю, что узлы находятся один под другим, но без просмотра необработанного XML, который вы хотите десериализовать, трудно сказать.
Мое лучшее предположение состояло бы в том, чтобы сделать следующее:
public class FeePlanGenerate
{
[XmlElement]
public List<FeePlan> FeePlanList { get; set; }
[XmlElement]
public List<FeeComponent> FeeComponentList { get; set; }
public string StudentName { get; set;}
public string StudentAddress { get; set; }
public string CurriculumName { get; set; }
public string CourseName { get; set; }
public string BCNumber { get; set; }
public DateTime? AddmissionDate { get; set; }
public string AddmissionOfficer{ get; set; }
public string Contant1 { get; set; }
public string Contant2 { get; set; }
public string AdmissionCode { get; set; }
public decimal? TotalInvoiceAmount { get; set; }
public decimal? TotalPayableFee { get; set; }
public string ArrayOfFeePlanGenerate { get; set; }
}