wcf netdatacontractserializer исключение сериализации idictionary с перечислением в качестве ключа

Я использую NetDataContractSerialiser с WCF. Это хорошо работает со всеми сериализуемыми типами. Однако вызываемая мной служба генерирует следующее исключение

Средство форматирования выдало исключение при попытке десериализации сообщения:

Произошла ошибка при попытке десериализации параметра http://tempuri.org/:xmlServiceObjIN. Сообщение InnerException: «Десериализатор не может загрузить тип для десериализации, потому что тип» System.Collections.Generic.EnumEqualityComparer`1 [[GrantEd.Common.DomainModel.Code.Enums.enumFundingParameterContextKey, GrantEd.Common.DomainModel.Codel.Codel.Code .71.0, Культура = нейтральный, PublicKeyToken = null]] 'не удалось найти в сборке' mscorlib, Версия = 2.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089 '. Убедитесь, что сериализуемый тип имеет тот же контракт, что и десериализуемый тип, и что используется та же сборка. '. Дополнительные сведения см. В разделе InnerException.

У сериализуемого класса есть свойство, определенное как

public IDictionary<enumFundingParameterContextKey, string>  Context { get; set; }

объявление перечисления

[Serializable]
public enum enumFundingParameterContextKey
{
    [EnumMemberAttribute()]
    ClientId = 0,
    [EnumMemberAttribute()]
    EntitlementDefinitionId = 1
}

который определен в другом asmebly.

Когда я заменяю перечисление на int, класс десериализуется без проблем. Любые идеи, почему использование перечисления приведет к исключению?

Причина использования NetDataContractSerializer заключалась в том, чтобы информация о типе была доступна и избегала использования KnownType


person Peter    schedule 02.06.2011    source источник


Ответы (2)


Сделайте базовый тип нецелочисленным для вашего перечисления. например байт.

Пример:

[Serializable] public enum enumFundingParameterContextKey : byte
{
    [EnumMemberAttribute()]
    ClientId = 0,
    [EnumMemberAttribute()]
    EntitlementDefinitionId = 1
}

Подробности в моем следующем сообщении в блоге: dotnet-35 -to-dotnet-40-enum

person Kajal Sinha    schedule 14.06.2012

Попробуйте пометить enum [DataContract] вместо [Serializable]. Но похоже, что тип перечисления на клиенте вообще неизвестен.

person Ladislav Mrnka    schedule 02.06.2011
comment
к сожалению, не повезло после перехода на использование DataContract. Проверено также правильная сборка на клиенте. - person Peter; 03.06.2011