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() метод должен иметь один аргумент типа элементов


вам нужно реализовать метод 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.");
    }