尝试序列化Entity Framework对象时出现XML序列化错误

5
我有一些通过Entity Framework获取的实体对象。我正在使用Code-First,所以它们是POCOs。当我尝试使用XmlSerializer对它们进行XML序列化时,我会收到以下错误信息:
“类型System.Data.Entity.DynamicProxies.Song_C59F4614EED1B7373D79AAB4E7263036C9CF6543274A9D62A9D8494FB01F2127未被预期。请使用XmlInclude或SoapInclude属性来指定静态未知的类型。”
有人有解决这个问题的想法吗(除了创建一个全新的对象)?
3个回答

6

很抱歉,我知道我有点晚了(几年晚了),但如果您不需要代理对象进行延迟加载,您可以这样做:

Configuration.ProxyCreationEnabled = false;

在你的情况下,这种方法对我很有效。Shiv Kumar实际上更好地解释了为什么,但至少这可以让你重新开始工作(假设你不需要代理)。


6

0

另一种不依赖于数据库配置的方法是对对象进行深度克隆。

我在我的代码优先 EF 项目中使用 Automapper (https://www.nuget.org/packages/AutoMapper/) 来实现这个功能。以下是一些示例代码,用于导出名为 'IonPair' 的 EF 对象列表:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接