1

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(); 
}
4

2 回答 2

1

我在上面的评论中链接到该帖子的原因(已删除)是它指出:

在对象的反序列化过程中,负责反序列化对象的类创建序列化类的实例,然后仅在获取要填充的实例后才继续填充序列化的字段和属性。

您可以从Appointment 构造函数的文档中看到,该构造函数中Appointment需要一个实例ExchangeService......没有无参数构造函数,因此出现错误。

我不知道序列化过程的所有内部工作原理,但希望这至少能给你一个错误的原因。

通常,如果它是您自己的类,您应该能够添加一个额外的(无参数)构造函数,但我不确定在这种情况下您会做什么。很可能有另一种方法可以成功序列化Appointment该类,但我不确定。

您可以尝试扩展Appointment该类,在其中提供一个无参数构造函数,然后使用 XML 对其进行序列化。我不确定它会起作用,但也许其他人可以提供更明确的答案。

public class MyAppointment : Appointment
{
    public MyAppointment() { }
}

如果我在上面找到任何其他内容,我会更新它。

于 2013-05-30T23:47:34.210 回答
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();
        }
于 2013-05-31T01:34:33.653 回答