XmlSerializer - linq-to-sql - 在序列化类型的对象时检测到循环引用

时间:2012-01-26 21:20:35

标签: c# linq-to-sql

我正在尝试在我的linq-to-sql MVC2 webapp中使用XmlSerializer将复杂对象存储在数据库中。我一直在谷歌搜索和试验过去3天,无法通过这个循环引用错误。我已经阅读了许多文章,提出了如何解决这个问题的建议,但没有一篇文章对我有用。我特别想尝试这种策略,因为很多相关文章都链接到了这个。所以这篇文章似乎正在成为一种流行的方法:

http://www.west-wind.com/weblog/posts/2007/Sep/02/LINQ-to-SQL-and-Serialization

我试图在linq-to-sql中实现针对循环引用问题的这个建议修复,它只是不起作用。我有三重/四重检查,我正在将所有子属性访问修饰符更改为内部,但无济于事。无论我做什么,我总是得到循环引用错误。每次更改后我都会重新编译。我确保将Parent属性访问修饰符保留为public。

根据我读到的另一篇文章,我也尝试将所有EntitySet归结为: [System.Xml.Serialization.XmlIgnore]

这对我来说也不起作用 - 同样的错误。

我没有使用WCF - 只是在使用MVC2的webapp中使用linq到sql。无论复杂程度如何,我都可以毫无问题地序列化非linq-to-sql对象。

这是我的序列化功能:

private static string SerializeToString(object obj)
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", ""); 

        XmlSerializer serializer = new XmlSerializer(obj.GetType(), "");
        using (StringWriter writer = new StringWriter())
        {
            serializer.Serialize(writer, obj, ns);
            return writer.ToString();
        }
    }

如果有人对此有所了解,我很乐意听到。

2 个答案:

答案 0 :(得分:1)

Espen Burod是对的。不要直接序列化您的entites。而是创建数据传输模型并序列化该模型。您可以使用AutoMapper在两者之间进行映射。

答案 1 :(得分:-1)

当您需要相互引用的对象时,会发生循环引用。序列化程序不支持这些引用。

例如:

public class Object1
{
    public Object2 SecondObject { get; set; } 
}


public class Object2
{
    public Object1 FirstObject { get; set; } 
}