C#: для сериализации XML типы, наследуемые от IEnumerable, должны иметь реализацию Add (System.Объект)
поэтому у меня есть следующий код:
private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv)
{
FindItemsResults 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.Обмен.Веб-сервисы.Данные.FindItemsResults не реализует Add (System.Объект.)
Я искал вокруг, и Я пришел к выводу, что мне нужно добавить общедоступный метод Add(Object obj). Теперь я не совсем уверен, что этот метод должен содержать или когда он называется, может ли кто-нибудь указать мне в правильном направлении? Метод Add должен вручную добавлять каждую встречу?
некоторые ссылки, которые я нашел полезными: здесь здесь
ценится.
3 ответов
вам нужно реализовать метод Add, который может поместить объект типа, содержащегося в IEnumerable, обратно в IEnumerable при десериализации FindItemsResult и содержащихся в нем объектов. IEnumerable не похож на список, поэтому десериализованный элемент не может быть просто помещен обратно в контейнер. Невозможно узнать, как можно реализовать класс, реализующий IEnumerable, поэтому вы должны явно написать для него метод Add.
я столкнулся с этой же проблемой при создании выгружаемого объекта result. Выбранный ответ в основном правильный, но я думал, что просто отформатирую его немного лучше, а также добавлю свой собственный совет.
в основном я реализовал 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.");
}