Почему я не могу использовать WCF DataContract и ISerializable в одном классе? - PullRequest
11 голосов
/ 17 марта 2010

У меня есть класс, который мне нужно иметь для сериализации в переменную сеанса 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))]

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

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

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

Дейв

Ответы [ 3 ]

8 голосов
/ 17 марта 2010

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

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

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

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

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

1 голос
/ 23 апреля 2013

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

0 голосов
/ 27 ноября 2011

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

...