У меня следующая проблема, учитывая следующий контракт на обслуживание, контракт на данные и реализацию сервиса, как мне заставить 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, котороеявляется круглым, но не достаточно обширным.
Кроме того, в моем случае невозможно «сгладить» объекты в дереве, им необходимо поддерживать одинаковые ссылки на объекты.
Спасибозаранее на любой совет или понимание этой проблемы.