Ошибки сериализации XML при попытке сериализации объектов Entity Framework - PullRequest
5 голосов
/ 06 февраля 2011

У меня есть объекты, которые я получаю через Entity Framework.Я использую Code-First, поэтому они POCO.Когда я пытаюсь сериализовать их в формате XML с помощью XmlSerializer, я получаю следующую ошибку:

Тип System.Data.Entity.DynamicProxies.Song_C59F4614EED1B7373D79AAB4E7263036C9CF6543274A9D62A9D8494FB не ожидается.Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически.

У кого-нибудь есть идеи, как обойти это (кроме создания целого нового объекта)?

Ответы [ 3 ]

6 голосов
/ 13 ноября 2013

Извините, я знаю, что немного позже (на пару ЛЕТ поздно), но если вам не нужны прокси-объекты для отложенной загрузки, вы можете сделать это:

Configuration.ProxyCreationEnabled = false;

в вашем контексте. Работал как шарм для меня. Шив Кумар на самом деле дает лучшее понимание того, почему, но это, по крайней мере, вернет вас к работе (опять же, при условии, что вам не нужны прокси).

6 голосов
/ 06 февраля 2011

Просто сказать, что POCO не очень помогает (особенно в этом случае, так как похоже, что вы используете прокси).Прокси во многих случаях пригодятся, но усложняют сериализацию, поскольку сериализуемый объект на самом деле является не вашим объектом, а экземпляром прокси.

Этот пост должен дать вам ответ.http://blogs.msdn.com/b/adonet/archive/2010/01/05/poco-proxies-part-2-serializing-poco-proxies.aspx

0 голосов
/ 05 мая 2015

Другим способом, который работает независимо от конфигурации базы данных, является глубокое клонирование ваших объектов.

Я использую Automapper (https://www.nuget.org/packages/AutoMapper/) для этого в моем EF-проекте с первым кодом. Вот пример кода, который экспортирует список объектов EF с именем 'IonPair':

        public bool ExportIonPairs(List<IonPair> ionPairList, string filePath)
    {
        Mapper.CreateMap<IonPair, IonPair>();                       //creates the mapping
        var clonedList = Mapper.Map<List<IonPair>>(ionPairList);    // deep-clones the list. EF's 'DynamicProxies' are automatically ignored.
        var ionPairCollection = new IonPairCollection { IonPairs = clonedList };
        var serializer = new XmlSerializer(typeof(IonPairCollection));

        try
        {
            using (var writer = new StreamWriter(filePath))
            {
                serializer.Serialize(writer, ionPairCollection);
            }
        }
        catch (Exception exception)
        {
            string message = string.Format(
                "Trying to export to the file '{0}' but there was an error. Details: {1}",
                filePath, exception.Message);

            throw new IOException(message, exception);
        }

        return true;
    }
...