序列化异常 - 无法序列化,因为它没有无参数构造函数

时间:2013-05-30 23:33:28

标签: c# xml serialization exchangewebservices xmlserializer

初始化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(); 
}

2 个答案:

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