C#:要使XML可序列化,从IEnumerable继承的类型必须具有Add(System.Object)的实现

C#:要使XML可序列化,从IEnumerable继承的类型必须具有Add(System.Object)的实现,c#,serialization,ienumerable,add,exchangewebservices,C#,Serialization,Ienumerable,Add,Exchangewebservices,我有以下代码: private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv) { FindItemsResults<Appointment> appointments = serv.FindAppointments(WellKnownFolderName.Calendar, calendar); var serializer = new X

我有以下代码:

private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv)
{
    FindItemsResults<Appointment> appointments = serv.FindAppointments(WellKnownFolderName.Calendar, calendar);

    var serializer = new XmlSerializer(appointments.GetType());
    var writer = new StringWriter();

    try
    {
        serializer.Serialize(writer, appointments);
        Console.WriteLine(writer.GetStringBuilder().ToString());
        Console.ReadLine();
    }
    catch (Exception ex) 
    {
        Console.WriteLine(ex);
        Console.ReadLine();
    }

    return writer.GetStringBuilder().ToString();
}
私有静态字符串FindAppointmentsAsXmlString(日历视图日历,ExchangeService服务)
{
查找结果


非常感谢。

当您反序列化FindItemsResult及其包含的对象时,您需要实现一个Add方法,该方法可以将IEnumerable包含的类型的对象放回到IEnumerable中。
IEnumerable与列表不同,因此反序列化项通常不能放回某种容器中。无法知道如何实现实现IEnumerable的类,因此必须显式为其编写Add方法。

The
Add()
方法应具有
IEnumerable
对象中元素类型的单个参数。例如,如果
FindItemsResults
实现
IEnumerable
,则可以添加方法
void add(T值)
。如果希望
FindItemsResults
为只读,可以通过
ToList()将
FindItemsResults
转换为列表
扩展方法并序列化列表,而不是
FindItemsResults
对象本身。

我在创建分页结果对象时遇到了同样的问题。选择的答案基本上是正确的,但我认为我只需将其格式设置得更好一点,并添加我自己的提示

基本上我实现了Add,但我让它抛出一个异常来指导可能尝试调用它的任何未来开发人员,因为作为结果集,我希望它保持为只读。序列化程序仍然可以正常工作,因此它显然在序列化时从不调用Add。我可能会遇到反序列化问题,但因为此对象纯粹用于重试一个结果集应该都是好的

下面是我添加到已实现IEnumerable的类中的内容:

    public void Add(T value)
    {
        throw new NotSupportedException("Add is not supported for paged results.  Try adding new items to the repository instead.");
    }

正如您所说,我实现了Add方法,但不幸的是仍然引发了相同的异常。Edit:我没有调用Add方法-我该怎么做?var serializer=new XmlSerializer(appoints.GetType().Add())?不,这不起作用…您的add方法是否将class object的对象作为参数?我认为,当您尝试反序列化实现IEnumerable的对象时,add方法将自动调用。我已将FindItemsResults约会转换为列表,并将其序列化。但是,现在我遇到了一个异常:Microsoft.E无法序列化xchange.WebServices.Data.Appointment,因为它没有参数化构造函数。有什么想法吗?您可能会遇到此错误,因为FindItemsResults对象图中的某些内容无法使用XmlSerializer直接序列化。您可以尝试更健壮的DataContractSerializer,或者转换FindItemsResultsobject图形转换为更简单的格式(POCO DTOs)