Почему я не могу использовать 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. Ничего не работало, и я собирался сдаться, когда попытался удалить виртуальные теги у членов. Внезапно он начал работать. Попробуйте.