Почему я не могу использовать WCF DataContract и ISerializable в одном классе?

У меня есть класс, который должен иметь возможность сериализовать переменную сеанса SQLServer и быть доступен через службу WCF. Я заявил следующее:

namespace MyNM
{
[Serializable] 
[DataContract(Name = "Foo", Namespace = "http://www.mydomain.co.uk")]

public class Foo : IEntity, ISafeCopy<Foo>
{
    [DataMember(Order = 0)] 
    public virtual Guid Id { get; set; }

    [DataMember(Order = 1)] 
    public virtual string a { get; set; }

    DataMember(Order = 2)]
    public virtual Bar c { get; set; }

    /* ISafeCopy implementation */
}


[Serializable]
[DataContract(Name = "Bar ", Namespace = "http://www.mydomain.co.uk")]
public class Bar : IEntity, ISafeCopy<Bar>
{
    #region Implementation of IEntity

    DataMember(Order = 0)]
    public virtual Guid Id { get; set; }
    [DataMember(Order = 1)]
    public virtual Baz y { get; set; }

    #endregion

    /* ISafeCopy implementation*/
}


[Serializable]
[DataContract]
public enum Baz
{
    [EnumMember(Value = "one")]
    one,
    [EnumMember(Value = "two")]
    two,
    [EnumMember(Value = "three")]
    three
}

Но когда я пытаюсь вызвать эту службу, я получаю следующую ошибку в журнале трассировки.

"System.Runtime.Serialization.InvalidDataContractException: Тип 'BarProxybcb100e8617f40ceaa832fe4bb94533c' не могут быть ISERializable и иметь Атрибут DataContractAttribute."

Если я выберу атрибут Serializable, служба WCF работает, но когда объект не может быть сериализован для сеанса. Если я удалю атрибут DataContract из класса Bar, служба WCF не сможет сказать

Тип 'BarProxy3bb05a31167f4ba492909ec941a54533' с именем контракта с данными 'BarProxy3bb05a31167f4ba492909ec941a54533: http://schemas.datacontract.org/2004/07/' не ожидается. Добавить любые типы, а не известную статически в список известных типов - например, используя Атрибут KnownTypeAttribute или добавив их в список известных типов передано в DataContractSerializer

Я попытался добавить атрибут KnownType в класс foo

[KnownType(typeof(Bar))]

Но я все равно получаю ту же ошибку.

Может ли кто-нибудь помочь мне с этим?

Большое спасибо

Дейв

Ответ 1

Этот вопрос в MSDN может помочь: DataContract to Serializable.

Принятый ответ из этого потока:

  • [DataContract] и [Serializable] могут использоваться вместе.

  • DataContractSerializer понимает их оба. Если тип отмечен обоими из них, он примет проекцию [DataContract]

  • Вот документы по передаче и сериализации данных в WCF, которые предоставляют много деталей для сериализаторов и известного типа: Передача данных и сериализация

Ответ 2

Я знаю, что это очень поздно, но на случай, если кто-нибудь прочтет это, у нас была аналогичная проблема. Наше решение оставить DataContract, так как WCF сериализуется отлично, а затем, когда мы сериализовались в сеансе SQL Server, мы сериалировали объект в JSON и написали его на сеанс.

Ответ 3

Я столкнулся с этой же проблемой с сериализацией для pocos фреймворка сущности через wcf. Ничего не работало, и я собирался сдаться, когда попытался удалить виртуальные теги у членов. Внезапно он начал работать. Попробуйте.