Циклическая эталонная ссылка WCF и ошибка переполнения стека - PullRequest
2 голосов
/ 29 марта 2012

У меня следующая проблема, учитывая следующий контракт на обслуживание, контракт на данные и реализацию сервиса, как мне заставить WCF сериализовать мой граф объектов без переполнения стека?

Сервисный контракт:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    TestObjectA CircularSerializationTest();
}

Контракты на данные

[DataContract(IsReference = true)]
public class TestObjectA
{
    [DataMember]
    public TestObjectB B { get; set; }
}

[DataContract(IsReference = true)]
public class TestObjectB
{
    [DataMember]
    public TestObjectC C { get; set; }
}

[DataContract(IsReference = true)]
public class TestObjectC
{
    [DataMember]
    public TestObjectA A { get; set; }
}

Реализация услуги:

public class Service1 : IService1
{
    public TestObjectA CircularSerializationTest()
    {
        var a = new TestObjectA();
        var b = new TestObjectB();
        var c = new TestObjectC();

        a.B = b;
        b.C = c;
        c.A = a;

        return a;
    }
}

Почему этот вопрос уникален?Во-первых, каждый другой пример, который мне удалось найти, использует дерево объектов или круговые ссылки между двумя объектами.В случае дерева (Grandparent => Parent => Child) отношения на самом деле не круговые, но объекты используются между различными узлами.Или, во втором случае, либо один и тот же объект является циклическим (Person имеет список сотрудников, которые также являются персонами, это в одном из примеров, которые я нашел в MSDN), либо это отношение parent => child => parent, котороеявляется круглым, но не достаточно обширным.

Кроме того, в моем случае невозможно «сгладить» объекты в дереве, им необходимо поддерживать одинаковые ссылки на объекты.

Спасибозаранее на любой совет или понимание этой проблемы.

1 Ответ

4 голосов
/ 30 марта 2012

Я понял это.

Кажется, что переполнение стека вообще не происходит в WCF, это происходит в тестовом клиенте WCF.Я думаю, что Visual Studio должен подключиться к нему, потому что когда он падает, он взрывается внутри Visual Studio, поэтому я подумал, что это проблема с сервисом.Тестовый клиент отображает результат в виде дерева, и я предполагаю, что он не ожидал, что результатом может быть циклический граф объектов, таким образом переполнение стека.

Извлеченный урок: не используйте WCFтестовый клиент.Используйте консольное приложение.

...