WCF десериализация словаря, в котором тип Enum является ключевым - PullRequest
5 голосов
/ 11 февраля 2010

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

У меня есть два объекта данных:

[DataContract] 
public enum MyEnum : int
{
   [EnumMember]
   Value1 = 0,
   [EnumMember]
   Value2 = 1
}

и

[DataContract]
[KnownType(typeof(MyEnum))] 
public class ReturnData
{
   [DataMember]
   public IDictionary<Enum, string> codes;
}

На самом деле ReturnData класс содержит больше элементов данных, но они не важны для моего примера.

Эти объекты данных возвращаются методом:

[OperationContract]
public ReturnData Method1()
{
 ReturnData data = new ReturnData();
 data.codes = new Dictionary<Enum, string>();
 data.codes.Add(MyEnum.Value1, "stringA");

 return data;
}

Когда я вызываю Method1 со стороны клиента, выдается следующее исключение:

Средство форматирования выдало исключение при попытке десериализации сообщения: при попытке десериализации параметра произошла ошибка http://tempuri.org/:Method1Result. Сообщение InnerException было «Ошибка в строке 1, позиция 522. Элемент» http://schemas.microsoft.com/2003/10/Serialization/Arrays:Key' содержит данные контракта с данными http://schemas.datacontract.org/2004/07/AMService:MyEnum'. Десериализатор не знает ни одного типа, который соответствует этому контракту. Добавьте тип, соответствующий «MyEnum», в список известных типов, например, с помощью атрибута KnownTypeAttribute или добавив его в список известных типов, передаваемых в DataContractSerializer. '

Есть идеи, как определить класс ReturnData для решения этой проблемы?

Примечание: Когда я заменяю ReturnData member codes на использование в качестве ключевого типа данных MyEnum вместо Enum public IDictionary<MyEnum, string> codes;, десериализация работает правильно, и данные без проблем передаются со стороны сервера на сторону клиента. 1034 *

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2010

В верхней части вашего класса добавьте атрибут KnownType.

using System.Runtime.Serialization;

[KnownType(typeof(MyEnum))]
[DataContract]
public class Foo {

}
0 голосов
/ 11 февраля 2010

не должно этой строки

data.codes = new Dictionary<Enum, string>();

быть

data.codes = new Dictionary<MyEnum, string>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...