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

时间:2013-05-30 22:31:48

标签: c# serialization ienumerable add exchangewebservices

我有以下代码:

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

初始化序列化程序时,我得到例外:

要成为XML可序列化的,从IEnumerable继承的类型必须具有 在其继承层次结构的所有级别实现Add(System.Object)。

Microsoft.Exchange.WebServices.Data.FindItemsResults未实现Add(System.Object)。

我一直在搜索,我得出的结论是我必须添加一个公共的Add(Object obj)方法。现在我不确定这个方法应该包含什么或什么时候被调用,有人能指出我正确的方向吗? Add方法是否需要手动添加每个约会?

我发现一些有用的链接: here here

非常感谢。

3 个答案:

答案 0 :(得分:4)

Add()方法应该有一个IEnumerable对象中元素类型的参数。例如,如果FindItemsResults实现了IEnumerable<T>,那么您可以添加方法void Add(T value)。如果您希望FindItemsResults为只读,则可以通过FindItemsResults扩展方法将ToList()转换为列表,并序列化列表而不是FindItemsResults对象本身。 / p>

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

基本上我实现了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.");
    }