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方法。TheAdd()
方法应具有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)