初始化XMLSerializer
并向其传递Appointment
实例(来自EWS API)时,我收到异常:
Microsoft.Exchange.WebServices.Data.Appointment无法序列化,因为它没有无参数构造函数。
这是我的代码:
private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv)
{
FindItemsResults<Appointment> appointments = serv.FindAppointments(
WellKnownFolderName.Calendar, calendar);
List<Appointment> appointmentsList = appointments.ToList();
var serializer = new XmlSerializer(appointmentsList.GetType());
var writer = new StringWriter();
try
{
serializer.Serialize(writer, appointmentsList);
Console.WriteLine(writer.GetStringBuilder().ToString());
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.ReadLine();
}
return writer.GetStringBuilder().ToString();
}
答案 0 :(得分:1)
我在(自已删除)上面的评论中与post相关联的原因是它声明:
在对象的反序列化过程中,负责反序列化对象的类会创建序列化类的实例,然后只有在获取要填充的实例后才会填充序列化的字段和属性。
您可以从Appointment constructor的文档中看到Appointment
在构造函数中需要ExchangeService
的实例...没有无参数构造函数,因此错误。
我不知道序列化过程的所有内部工作原理,但希望这至少可以为您提供错误的原因。
通常,如果它是你自己的类,你应该只能添加一个额外的(无参数)构造函数,但我不确定你在这种情况下做了什么。可能有另一种成功序列化Appointment
类的方法,但我不确定。
您可以尝试扩展Appointment
类,在其中提供无参数构造函数,然后使用XML对其进行序列化。我不确定它是否有效,但也许其他人可以提供更明确的答案。
public class MyAppointment : Appointment
{
public MyAppointment() { }
}
如果我发现其他任何内容,我会更新。
答案 1 :(得分:1)
如果您使用AutoMapper,请通过Nuget或https://github.com/AutoMapper/AutoMapper获取它 如果你这样做: -
namespace DTO
{
public class CalendarAppointment : Appointment
{
public CalendarAppointment() : base( /* any parameters to construct the base appointment, doesn't matter /* )
{
}
}
}
然后你可以做
private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv)
{
FindItemsResults<Appointment> appointments = serv.FindAppointments(
WellKnownFolderName.Calendar, calendar);
Mapper.CreateMap<Appointment, DTO.CalendarAppointment>();
var list = appointments.Select(Mapper.Map<DTO.CalendarAppointment>).ToList();
var serializer = new XmlSerializer(list.GetType());
var writer = new StringWriter();
try
{
serializer.Serialize(writer, list);
Console.WriteLine(writer.GetStringBuilder().ToString());
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.ReadLine();
}
return writer.GetStringBuilder().ToString();
}