Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > wcf серилизация


Автор: GRemlin87 23.1.2012, 12:30
Столкнулся вот с такой вот трудностью.Создаю wcf службу:
Код

 [ServiceContract]
    public interface IService1
    {
        [OperationContract]   
        CompositeType GetDataUsingDataContract();

     }
public class Service1 : IService1
    {
    
        public CompositeType GetDataUsingDataContract()
        {
            var type=new CompositeType();
            type.status = new Status(type);
            return type;
        }
    }

[DataContract]
    public class Status
    { 
       [DataMember]
       private CompositeType composite;
       
       public Status(CompositeType comp)
       {
           composite = comp;
       }       
    }
    [DataContract]
    public class CompositeType
    {
        [DataMember]
        public Status status { get; set;}

    }

Дак вот, при вызове метода GetDataUsingContract() служба падает с сообщением
Не удалось вызвать службу. Возможные причины: служба отключена или недоступна; конфигурация клиента не совпадает с прокси; введен недопустимый существующий прокси. Для получения дополнительных сведений см. трассировку стека. Можно выполнить восстановление, запустив новый прокси, восстановив конфигурацию по умолчанию или обновив службу.

которое собственно мне совсем не помогло, единственную проблему которую я тут увидел это циклическая ссылка. Судя по англоязычным блогам и мануалам, проблема решается добавлением к DataContract  IsReference=true, но после этого служба стала падать с сообщение StackOverflow exception. Может есть у кого мысли как с подобным бороться?

Автор: mihryak 26.1.2012, 16:01
Избавляться от циклических ссылок - служба сериализует CompositeType, видит, что там есть DataMember Status, сериализует его, видит, что там есть свойство CompositeType, сериализует его, ...... Вот тебе и StackOverflow.

Можно, конечно, в классе Status убрать атрибут DataMember у свойства CompositeType, но устроит ли тебя, что в десериализованном варианте оно будет пустым?
По-хорошему, должно устраивать, ведь ситуация, когда это не так, говорит о плохом дизайне - лучше определись чётко, какой из этих классов действительно должен хранить инстанс другого, и оставь такое место единственным.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)