XmlSerializer - linq-to-sql - при сериализации объекта типа обнаружена циклическая ссылка - PullRequest
1 голос
/ 27 января 2012

Я пытаюсь использовать XmlSerializer в своем веб-приложении MVC2 linq-to-sql для хранения сложных объектов в базе данных. Я гуглил и экспериментировал последние 3 дня и не могу обойти эту круговую ссылку. Я прочитал много статей с предложениями о том, как решить эту проблему, и ни одна из них не сработала для меня. Я особенно пробовал эту тактику, потому что множество связанных статей ссылаются на эту. Так что эта статья, похоже, становится популярным подходом:

http://www.west -wind.com / блог / сообщений / 2007 / Сентябрь / 02 / LINQ к SQL-и-Сериализация

Я попытался реализовать это предлагаемое исправление для проблем с циклической ссылкой в ​​linq-to-sql, и оно просто не работает. Я трижды / четыре раза проверил, что я изменяю ВСЕ модификаторы доступа дочерних свойств на Внутренний, но безрезультатно. Я всегда получаю ошибку циклической ссылки независимо от того, что я делаю. Я перекомпилирую после каждого изменения курса. Обязательно оставьте для доступа модификатор доступа к родительскому свойству.

На основании другой статьи, которую я прочитал, я также попытался приписать все EntitySet следующим образом: [System.Xml.Serialization.XmlIgnore]

У меня это тоже не сработало - та же ошибка.

Я не использую WCF - просто linq to sql в веб-приложении с MVC2. Я могу без проблем сериализовать объекты, не относящиеся к 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 ]

1 голос
/ 27 января 2012

Эспен Бурод прав. Не сериализуйте напрямую ваши энтиты. Вместо этого создайте модель передачи данных и сериализуйте ее. Вы можете отобразить между ними, используя AutoMapper.

0 голосов
/ 27 января 2012

Циркулярная ссылка возникает, когда вам нужно объекты, которые ссылаются друг на друга.Эти виды ссылок не поддерживаются сериализатором.

Например:

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


public class Object2
{
    public Object1 FirstObject { get; set; } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...